[GD]png 画像の透過・リサイズ

2011/08/11

久々に PHP ネタ。 GD で png 画像を透過、リサイズしてみる。

サンプル

    function resize_image($org_path, $new_path, $to_width, $to_height) {
        list($org_width , $org_height) = getimagesize($org_image_path);
        $src_image = imagecreatefrompng($org_path);

        $rate = 1;
        if ($org_width > $org_height) {
            $rate = $to_width / $org_width;
        } elseif ($org_width < $org_height) {
            $rate = $to_height / $org_height;
        } else {
            if ($to_width > $to_height) {
                $rate = $to_height / $org_height;
            } else {
                $rate = $to_width / $org_width;
            }
        }
        $to_width = $rate * $org_width;
        $to_height = $rate * $org_height;

        // 再サンプル
        $new_image = imagecreatetruecolor($to_width, $to_height);
        imagealphablending($new_image, false);
        imagesavealpha($new_image, true);

        imagecopyresampled($new_image, $src_image, 0, 0, 0, 0, $to_width, $to_height, $org_width, $org_height);

        imagepng($new_image, $new_image_path);

        imagedestroy($src_image);
        imagedestroy($new_image);
    }

png 透過の手順は、 (1) imagecreatetruecolor() で画像作成 (2) imagealphablending(), imagesavealpha() でアルファチャンネルの作成 (3) imagepng() で画像の書き出し

リサイズの手順は (1) getimagesize() で取得したサイズ配列から (2) 比率を計算(サンプルの計算はちょっとあやしいかも) (3) imagecopyresampled() でリサンプリング