PHPでjpgなどの不透明な画像から透明度を持った画像を作成してpngで保存するとき、GDオブジェクトを作成して imagecopy や imagecopymerge を使っても透明にならない。
ならばどうすればいいかというと、元画像から imagecolorat で1ピクセルずつRGB色情報を取得して imagecolorallocatealpha で透明度情報を付加した色を作成し、imagesetpixel で1ピクセルずつ書き込むことで得られる。
<?php
function transparency($from, $to)
{
$sample = ImageCreateFromJPEG($from);
$width = imagesx($sample);
$height = imagesy($sample);
// 出力画像作成
$output = imagecreatetruecolor($width, $height);
$bg_color = imagecolorallocatealpha($output, 255, 255, 255, 127);
imagealphablending($output, true); //透明度情報を保存するフラグ
imagesavealpha($output, true); //透明度情報を保存するフラグ
imagefill($output, 0, 0, $bg_color);
// 透明度を付けて1pxごとにコピー
for ($y=0; $y<$height; $y++) {
for ($x=0; $x<$width; $x++) {
$rgb = imagecolorat($sample, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$color = imagecolorallocatealpha($output, $r, $g, $b, 64);
imagesetpixel($output, $x, $y, $color);
}
}
imagepng($output, $to);
}
transparency('from.jpg', 'to.png');