透過指定のあるPNGをimagejpegで出力すると黒く塗りつぶされる 
2019/03/30 Sat.
256色以下のパレットカラーの場合のPNG画像に透過指定がある場合、サイズ変更しない場合はなにも考えず、
$im = imagecreatefrompng('256色透過.png');
header('Content-type: image/jpeg');
imagejpeg($im, NULL, 70);
で問題なく出力されます。
しかし、リサイズする場合はちょっと工夫しないとJPEG出力したときに透過部分が黒くなってしまいます。
特に、透過指定のあるフルカラーPNGの場合は、リサイズしなくても黒く塗りつぶされてしまいます。
試行錯誤した結果、透過部分を指定した色で塗りつぶすという方法で解決とする。
$imIn = imagecreatefrompng('透過指定のある.png');
$x = imagesx($imIn);
$y = imagesy($imIn);
$imOut = imagecreatetruecolor($x,$y);
#背景を白にする場合
imagefill($imOut, 0, 0, imagecolorallocate($imOut, 255, 255, 255));
imagecopyresampled($imOut,$imIn,0,0,0,0,$x,$y,$x,$y);
header('Content-type: image/jpeg');
imagejpeg($imOut, NULL, 70);
これで透過部分に任意の色がついた状態でJPEG出力されます。
$im = imagecreatefrompng('256色透過.png');
header('Content-type: image/jpeg');
imagejpeg($im, NULL, 70);
で問題なく出力されます。
しかし、リサイズする場合はちょっと工夫しないとJPEG出力したときに透過部分が黒くなってしまいます。
特に、透過指定のあるフルカラーPNGの場合は、リサイズしなくても黒く塗りつぶされてしまいます。
試行錯誤した結果、透過部分を指定した色で塗りつぶすという方法で解決とする。
$imIn = imagecreatefrompng('透過指定のある.png');
$x = imagesx($imIn);
$y = imagesy($imIn);
$imOut = imagecreatetruecolor($x,$y);
#背景を白にする場合
imagefill($imOut, 0, 0, imagecolorallocate($imOut, 255, 255, 255));
imagecopyresampled($imOut,$imIn,0,0,0,0,$x,$y,$x,$y);
header('Content-type: image/jpeg');
imagejpeg($imOut, NULL, 70);
これで透過部分に任意の色がついた状態でJPEG出力されます。
- 関連記事
category: PHP
この記事へのコメント
コメントの投稿
コメントは全て管理人が内容を確認してから表示されます(非公開コメント除く)。
内容によっては表示されない場合がありますことご了承願います。
内容によっては表示されない場合がありますことご了承願います。