読者です 読者をやめる 読者になる 読者になる

PHP/GD2でのGIF/PNG画像の透過を保持したままのリサイズ

PHP/GD2で画像リサイズを行う際、透過の部分が黒くなってしまう。

http://mediumexposure.com/smart-image-resizing-while-preserving-transparency-php-and-gd-library/
https://github.com/maxim/smart_resize_image

にあるものを使えば透過も保持される。肝は以下の部分(githubにあるソースより抜粋)。

    if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
      $transparency = imagecolortransparent($image);

      if ($transparency >= 0) {
        $transparent_color = imagecolorsforindex($image, $trnprt_indx);
        $transparency = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
        imagefill($image_resized, 0, 0, $transparency);
        imagecolortransparent($image_resized, $transparency);
      }
      elseif ($info[2] == IMAGETYPE_PNG) {
        imagealphablending($image_resized, false);
        $color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
        imagefill($image_resized, 0, 0, $color);
        imagesavealpha($image_resized, true);
      }
    }

ただし、github上のissuesにもあるように、$trnprt_indxは$transparencyに、$trnprt_colorは$transparent_colorに変更する必要がある(最初のURLのソースをコピペして変数名を修正しきれていない感じ)。