Как улучшить мой php resizer для поддержки альфа-PNG и прозрачных GIF-файлов - PullRequest
1 голос
/ 01 мая 2010

Я использую эту функцию для изменения размера изображений, но в итоге получаю уродливое жуткое изображение с черным фоном, если это прозрачный GIF или PNG с альфа-каналом, однако оно отлично работает для jpg и обычного png.

function cropImage($nw, $nh, $source, $stype, $dest) {
     $size = getimagesize($source);
     $w = $size[0];
      $h = $size[1];

      switch($stype) {
          case 'gif':
          $simg = imagecreatefromgif($source);
          break;
          case 'jpg':
          $simg = imagecreatefromjpeg($source);
          break;
          case 'png':
          $simg = imagecreatefrompng($source);
          break;
      }


     $dimg = imagecreatetruecolor($nw, $nh);

     switch ($stype)
    {
         case "png":

     imagealphablending( $dimg, false );
     imagesavealpha( $dimg, true );
     $transparent = imagecolorallocatealpha($dimg, 255, 255, 255, 127);
     imagefilledrectangle($dimg, 0,  0, $nw, $nh,  $transparent);

    break;
case "gif":
    // integer representation of the color black (rgb: 0,0,0)
    $background = imagecolorallocate($simg, 0, 0, 0);
    // removing the black from the placeholder
    imagecolortransparent($simg, $background);

    break;
     }



      $wm = $w/$nw;
      $hm = $h/$nh;
      $h_height = $nh/2;
      $w_height = $nw/2;

      if($w> $h) {
          $adjusted_width = $w / $hm;
          $half_width = $adjusted_width / 2;
          $int_width = $half_width - $w_height;
          imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
      } elseif(($w <$h) || ($w == $h)) {
          $adjusted_height = $h / $wm;
          $half_height = $adjusted_height / 2;
          $int_height = $half_height - $h_height;

     imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
      } else {
          imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
      }

      imagejpeg($dimg,$dest,100);
     }

Пример: cropImage("300","200","original.png","png","new.png");

Я использую php 5.3.2 и библиотеку GD в комплекте (совместим с 2.0.34)

Как заставить его поддерживать прозрачность? Я добавил imagealphablending() и imagesavealpha, но это не сработало. Или еще есть хорошие классы?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 мая 2010

Гадкий черный фон исчезает, если вы выводите изображение в png. Итак, вот два альтернативных решения, оба протестированных:

  1. Если вы можете сохранить миниатюру в виде png, просто сделайте это: измените imagejpeg($dimg,$dest,100); на imagepng($dimg,$dest);

  2. Если важно сохранить его в формате jpeg, удалите строки imagealphablending( $dimg, false ); и imagesavealpha( $dimg, true ); - значения по умолчанию true и false соответственно обеспечат желаемый эффект. Отключение альфа-смешивания имеет смысл только в том случае, если в результирующем изображении также есть альфа-канал.

0 голосов
/ 07 мая 2010

Я сам не тестировал, но у меня была такая идея, когда я работал над моим проектом.

Сначала найдите цвет, который не используется на изображении, и создайте новое изображение с этим фоном (например, с действительно ярким зеленым цветом, как они делают с захватом движения)

Затем скопируйте изображение с прозрачностью поверх него (я знаю, что это работает с PHP, я использовал это для наложения границ на изображения)

Затем используйте функцию imagecolortransparent, чтобы определить, какой цвет на этом изображении является прозрачным, и присвойте ему свой яркий зеленый цвет.

Думаю, это сработает, но я не проверял.

...