[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: img resize
NitroGenerate
Всем доброго времени суток. У меня в движке сайта есть функция изменения размера изображения. Мне нужно заставить её формировать размер нужный мне, но у меня почему-то всегда получается квадрат. Прошу вашей помощи.

Сама функция

/*
$src - имя файла в темпе
$dest- полный путь на сервере
$width - новый размер ширины
$height - новый размер высоты
$ext - расширение
$imgwidth, - текущий размер длинны
$imgheight - текущий размер высоты
*/

function img_resize_banner($src,$dest,$width,$height,$tolarge,$bgcolor,$ext,$imgwidth,$imgheight){ // $width - размер который должен получится длинна
if(!file_exists($src)) return false;
$icfunc="imagecreatefrom".$ext;
if(!function_exists($icfunc))return false;
echo "<font color=\"blue\"><br />прошли 2 return</font>";
if($tolarge!='1' && $imgheight<$width)$width=$imgheight;
$x_ratio=$height/$imgheight; // $imgheight- исходная высота картинки
$y_ratio=$width/$imgwidth; // $imgwidth - исходная длина картинки
$ratio=min($x_ratio,$y_ratio);
$use_x_ratio=($x_ratio==$ratio);
$new_width=$width;
$new_height=$height;

$isrc=$icfunc($src);
if($bgcolor!=0){
$new_left=$use_x_ratio?0:floor(($width-$new_width)/2);
$new_top=!$use_x_ratio?0:floor(($height-$new_height)/2);
$nn_width=$nn_height=$width;
$bgc=$bgcolor;
}else{
$new_left=0;
$new_top=0;
$nn_width=$new_width;
$nn_height=$new_height;
$bgc=0xFFFFFF;
}
$idest=imagecreatetruecolor($nn_width,$nn_height);
imagefill($idest,0,0,$bgc);
imagecopyresampled($idest,$isrc,$new_left,$new_top,0,0,$new_width,$new_height,$imgheight,$imgwidth);
if($ext=="gif")imagegif($idest,$dest);
elseif($ext=="png")imagepng($idest,$dest);
elseif($ext=="jpg")imagejpg($idest,$dest);
else imagejpeg($idest,$dest,85);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}

Вызываю ее с помощью :
img_resize_banner($_FILES['logo']['tmp_name'],$_SERVER['DOCUMENT_ROOT'].$GLOBALS['p']."/upload/b_img/".$filename,$arr_price[$ban_id]["width"],$arr_price[$ban_id]["height"],1,0xFFFFFF,$ext,$size[1],$size[0])

в результате я получаю квадрат от заданного размера новой ширины. Причем рисунок располагается вверху, а внизу не обрезает белый фон, никак не могу понять как его резануть =(




Спустя 17 минут (12.12.2011 - 16:52) ИНСИ написал(а):
NitroGenerate можешь использовать мой класс.
Свернутый текст
class img 
{

protected $imgPath = false;
protected $newFile = false;
protected $imgData = array();

function __construct($path = false) {

if($path == false || !file_exists($path))
return false;

$this->imgPath = $path;
$data = getimagesize($this->imgPath);

$this->imgData['basename'] = basename($this->imgPath);
$this->imgData['extension'] = strtolower(substr($data['mime'], strpos($data['mime'], '/')+1));
}

function uniqidName($length = 7, $ext = true) {

$arr = array_merge( range(0, 9), range('a','z'), range('A', 'Z') );

shuffle($arr);

foreach(array_rand($arr, $length) as $data)
$key .= $arr[$data];

if($ext == true)
return $key . '.' . $this->imgData['extension'];
else
return
$key;
}

function resize($width = false, $height = false, $savePath = false, $nameImg = false, $quality = 100) {

if($this->imgPath == false)
return false;

$return = array();
$info = getimagesize($this->imgPath);

$sfunc = 'image' . $this->imgData['extension'];
$isfunc = 'imagecreatefrom' . $this->imgData['extension'];

if(!function_exists($sfunc) || !function_exists($isfunc))
return false;

if($width == false && $height == false)
return false;

if($nameImg == false) {
$nameImg = $this->uniqidName();
} else {
$arr = explode('.', $nameImg);
if(end($arr) != $this->imgData['extension'])
$nameImg .= '.' . $this->imgData['extension'];
}

$savePath = ($savePath == false ? str_replace('\\', '/', dirname(__FILE__)) . '/' . $nameImg : $savePath . '/' . $nameImg);

$return = array();
$return['nameImg'] = $nameImg;
$return['savePath'] = $savePath;

$quality = ($quality > 100 ? 100 : (int)$quality);
$width = ($width == false ? $info[0] : (int)$width);
$height = ($height == false ? $info[1] : (int)$height);

$width = ($width > $info[0] ? $info[0] : $width);
$height = ($height > $info[1] ? $info[1] : $height);

$ratio = $width / $height;
$srcRatio = $info[0] / $info[1];

if($ratio < $srcRatio)
$height = $width / $srcRatio;
else
$width = $height * $srcRatio;

$srcImg = $isfunc($this->imgPath);
$destImg = imagecreatetruecolor($width, $height);

if(!imagecopyresampled($destImg, $srcImg, 0, 0, 0, 0, $width, $height, $info[0], $info[1]))
return false;

if($this->imgData['extension'] != 'gif')
$sfunc($destImg, $savePath, $quality);
else
$sfunc($destImg, $savePath);

imagedestroy($srcImg);
imagedestroy($destImg);

return $return;
}

function crop($width = false, $height = false, $savePath = false, $nameImg = false, $quality = 100) {

if($this->imgPath == false)
return false;

$src = ($this->newFile != false ? $this->newFile : $this->imgPath);

$info = getimagesize($src);
$sfunc = 'image' . $this->imgData['extension'];
$isfunc = 'imagecreatefrom' . $this->imgData['extension'];

if(!function_exists($sfunc) || !function_exists($isfunc))
return false;

if($width == false && $height == false)
return false;

if($nameImg == false) {
$nameImg = $this->uniqidName();
} else {
$arr = explode('.', $nameImg);
if(end($arr) != $this->imgData['extension'])
$nameImg .= '.' . $this->imgData['extension'];
}

$savePath = ($savePath == false ? str_replace('\\', '/', dirname(__FILE__)) : $savePath);

$return = array();
$return['nameImg'] = $nameImg;
$return['savePath'] = $savePath;

$quality = ($quality > 100 ? 100 : (int)$quality);
$width = ($width == false ? $info[0] : (int)$width);
$height = ($height == false ? $info[1] : (int)$height);

$width = ($width > $info[0] ? $info[0] : $width);
$height = ($height > $info[1] ? $info[1] : $height);

$savePath .= '/' . $nameImg;

$srcWidth = (int)$info[0];
$srcHeight = (int)$info[1];

$setWidth = abs((int)$width);
$setHeight = abs((int)$height);

$srcX = ceil(($srcWidth - $setWidth) / 2);
$srcY = ceil(($srcY - $setY) / 2);

if($srcX < 0 || $srcY < 0)
$srcX = $srcY = 0;

$outWidth = $setWidth;
$outHeight = $setHeight;

if($srcWidth < $setWidth || $srcHeight < $setHeight) {
$outWidth = $setWidth = $srcWidth;
$outHeight = $setHeight = $srcHeight;
}

$idest = imagecreatetruecolor($setWidth, $setHeight);
$isrc = $isfunc($src);

if(!imagecopyresampled($idest, $isrc, 0, 0, $srcX, $srcY, $outWidth, $outHeight, $outWidth, $outHeight))
return false;

if($this->imgData['extension'] != 'gif')
$sfunc($idest, $savePath, $quality);
else
$sfunc($idest, $savePath);

imagedestroy($isrc);
imagedestroy($idest);

return $return;
}

function cropThumb($width = false, $height = false, $savePath = false, $nameImg = false, $quality = 100) {

if($this->imgPath == false)
return false;

if($width == false || $height == false)
return false;

if($nameImg == false) {
$nameImg = $this->uniqidName();
} else {
$arr = explode('.', $nameImg);
if(end($arr) != $this->imgData['extension'])
$nameImg .= '.' . $this->imgData['extension'];
}

$info = getimagesize($this->imgPath);
$newName = $this->uniqidName();

$savePath = ($savePath == false ? str_replace('\\', '/', dirname(__FILE__)) : $savePath);

$return = array();
$return['nameImg'] = $nameImg;
$return['savePath'] = $savePath;

$width = (int)$width; $height = (int)$height;
$quality = ($quality > 100 ? 100 : (int)$quality);

$ratio = $width / $height;
$srcRatio = $info[0] / $info[1];

if($info[0] <= $width && $info[1] <= $height) {
$this->resize($info[0], $info[1], $savePath, $nameImg, $quality);
} else {
if($ratio < $srcRatio) {
$this->resize(false, $height, $savePath, $newName, $quality);
} else {
$this->resize($width, false, $savePath, $newName, $quality);
}

$this->newFile = $savePath . '/' . $newName;
$this->crop($width, $height, $savePath, $nameImg, $quality);

unlink($this->newFile);
$this->newFile = false;
}

return $return;
}
}


Работать с ним не сложно. К примеру:

$img = new img(сама фотка);
$img->cropThumb($width, $height); // Режит фото, уменьшив пропорционально
$img->crop($width, $height); // Режит фото - с центра
$img->resize($width, $height); // Уменьшает фото пропорционально


Можно указать дополнительные параметры, путь к папке, где надо сохранить и т.д.

Спустя 15 часов, 52 минуты, 6 секунд (13.12.2011 - 08:44) NitroGenerate написал(а):
Спасибо INSIDIOUS, я уже свой добил... =)
Закосячил и потом пол дня голову ломал, сегодня со свежей головой сразу нашел причину.
$nn_width=$nn_height=$width; =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.