как изменить размер изображения в PHP, сохраняя соотношение сторон, прозрачность, если файл представляет собой изображение gif
или png
, а затем центрировать изображение по вертикали или горизонтали в зависимости от конечного размера?
Изменение размера изображения в PHP с сохранением пропорций, прозрачности и центрирования
Ответы (5)
есть несколько приемов. вот моя функция:
function im_resize($file_src,$file_dest,$wd,$hd) {
if (!file_exists($file_src)) return false;
$size = getimagesize($file_src);
if ($size === false) return false;
if ($size['mime']=='image/pjpeg') $size['mime'] = 'image/jpeg';
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$destformat = strtolower(substr($file_dest, -4));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) return false;
$src = $icfunc($file_src);
$ws = imagesx($src);
$hs = imagesy($src);
if ($ws >= $hs) {
$hd = ceil(($wd * $hs) / $ws);
}
else {
$wd = ceil(($hd*$ws)/$hs);
}
if ($ws <= $wd) {
$wd = $ws;
$hd = $hs;
}
$wc=($wd * $hs) / $hd;
if ($wc<=$ws) {
$hc=($wc * $hd) / $wd;
}
else {
$hc=($ws * $hd) / $wd;
$wc=($wd * $hc) / $hd;
}
$dest = imagecreatetruecolor($wd,$hd);
switch ($format) {
case "png":
imagealphablending( $dest, false );
imagesavealpha( $dest, true );
$transparent = imagecolorallocatealpha($dest, 255, 255, 255, 127);
imagefilledrectangle($dest, 0, 0, $nw, $nh, $transparent);
break;
case "gif":
// integer representation of the color black (rgb: 0,0,0)
$background = imagecolorallocate($src, 0, 0, 0);
// removing the black from the placeholder
imagecolortransparent($src, $background);
break;
}
imagecopyresampled($dest,$src,0,0,($ws-$wc)/2,($hs-$hc)/2, $wd, $hd, $wc, $hc);
if (!isset($q)) $q = 100;
if ($destformat=='.png') $saved=imagepng($dest,$file_dest);
if ($destformat=='.jpg') $saved=imagejpeg($dest,$file_dest,$q);
if (!$saved) my_error_log('saving failed');
imagedestroy($dest);
imagedestroy($src);
@chmod($file_dest, 0666);
return true;
}
If
(…) затем центрируйте изображение по вертикали или горизонтали (…)
означает, что вы хотите добавить белую или черную рамку вокруг, я бы этого не сделал. Просто сохраните изображение с измененным размером и выполните центрирование в браузере с помощью html/css.
Для последующего поиска
Это правильный ответ
Я нашел этот ответ на основе: http://php.net/manual/en/function.imagecopyresampled.php#112742
function resizeKeepRatio($path,$new_path,$width, $height){
$image_info = getimagesize($path);
$image_type = $image_info[2];
if ($image_type == IMAGETYPE_JPEG) {
$image = imagecreatefromjpeg($path);
} elseif ($image_type == IMAGETYPE_GIF) {
$image = imagecreatefromgif($path);
} elseif ($timage_type == IMAGETYPE_PNG) {
$image = imagecreatefrompng($path);
}else{
return false; // The image type does not support
}
$new_image = imagecreatetruecolor($width, $height);
$src_w = imagesx($image);
$src_h = imagesy($image);
if($src_w > $src_h){
$dst_w = $width;
$dst_h = ($dst_w * $src_h) / $src_w ;
if($dst_h > $height){
$dst_h = $height;
$dst_w = ($dst_h * $src_w) / $src_h;
}
}else{
$dst_h = $height;
$dst_w = ($dst_h * $src_w) / $src_h;
if($dst_w > $width){
$dst_w = $width;
$dst_h = ($dst_w * $src_h) / $src_w;
}
}
$dst_x = abs($width - $dst_w) / 2;
$dst_y = abs($height - $dst_h) / 2;
$color = imagecolorallocatealpha($new_image, 0, 0, 0, 127); //fill transparent background
if ($image_type != IMAGETYPE_PNG) {
$color = imagecolorallocatealpha($new_image, 255, 255, 255, 0); //fill white background
}
imagefill($new_image, 0, 0, $color);
imagesavealpha($new_image, true);
imagecopyresampled($new_image, $image, $dst_x, $dst_y,0,0, $dst_w, $dst_h, $src_w, $src_h);
if ($image_type == IMAGETYPE_JPEG) {
imagejpeg(new_image, $new_path);
} elseif ($image_type == IMAGETYPE_GIF) {
imagegif(new_image, $new_path);
} elseif ($image_type == IMAGETYPE_PNG) {
imagepng(new_image, $new_path);
}
return true;
}
Сначала прочитайте размер изображения, размер которого вы хотите изменить, используя getimagesize();
Решите, какой максимальной ширины и высоты вы хотите, чтобы ваше измененное изображение было.
Узнайте, что является самым большим, шириной или высотой вашего изображения, размер которого нужно изменить.
Узнайте, насколько вы должны разделить эту сторону, чтобы сделать ее в пределах ширины или высоты измененного размера. Возьмите это значение, затем разделите другую сторону изображения, размер которого нужно изменить.
Теперь у вас есть результирующая ширина и высота измененного изображения. просто используйте imagecopyresampled().
Есть пакет PEAR под названием Image_Transform (http://pear.php.net/package/Image_Transform), который я использовал в прошлом. Он имеет множество отличных функций для работы с изображениями и очень прост в использовании (не обязательно быть продвинутым программистом на PHP).