PHPで不透明画像から半透明画像を作成する


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');