Изменение размера изображения в PHP с сохранением пропорций, прозрачности и центрирования

как изменить размер изображения в PHP, сохраняя соотношение сторон, прозрачность, если файл представляет собой изображение gif или png, а затем центрировать изображение по вертикали или горизонтали в зависимости от конечного размера?


person Mark    schedule 09.11.2010    source источник
comment
О каком аспекте операции у вас есть вопросы? Вы знакомы с библиотекой GD?   -  person Pekka    schedule 09.11.2010
comment
Также: stackoverflow.com/search?q=php+resize+image   -  person Pekka    schedule 09.11.2010
comment
Все они, я не знаком с GD, потому что я не совсем PHP-разработчик.   -  person Mark    schedule 09.11.2010


Ответы (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;
}
person heximal    schedule 09.11.2010

If

(…) затем центрируйте изображение по вертикали или горизонтали (…)

означает, что вы хотите добавить белую или черную рамку вокруг, я бы этого не сделал. Просто сохраните изображение с измененным размером и выполните центрирование в браузере с помощью html/css.

person Simon    schedule 09.11.2010

Для последующего поиска
Это правильный ответ
Я нашел этот ответ на основе: 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;
}
person Python    schedule 06.09.2018

Сначала прочитайте размер изображения, размер которого вы хотите изменить, используя getimagesize();

Решите, какой максимальной ширины и высоты вы хотите, чтобы ваше измененное изображение было.

Узнайте, что является самым большим, шириной или высотой вашего изображения, размер которого нужно изменить.

Узнайте, насколько вы должны разделить эту сторону, чтобы сделать ее в пределах ширины или высоты измененного размера. Возьмите это значение, затем разделите другую сторону изображения, размер которого нужно изменить.

Теперь у вас есть результирующая ширина и высота измененного изображения. просто используйте imagecopyresampled().

person Scott    schedule 09.11.2010

Есть пакет PEAR под названием Image_Transform (http://pear.php.net/package/Image_Transform), который я использовал в прошлом. Он имеет множество отличных функций для работы с изображениями и очень прост в использовании (не обязательно быть продвинутым программистом на PHP).

person justinl    schedule 09.11.2010