前回エントリではインデックスカラー画像の合成を試みました。サンプルプログラムのように周囲に余白が無い画像の場合には期待通りの合成ができるのですが、たとえばimagerotate関数で45度傾けた長方形の場合などには、合成する画像の周囲の余白を透明部分として処理する方法が無く暗幕を被せたようになってしまいます。これは前回も触れたとおりです。
ではGDライブラリがインデックスカラーの透過色に全く対応していないかというと、そういうことでもないようです。画像編集ソフトで透過色ありの設定で保存したPNGを読み込むと、それはそのまま透過色ありの画像として扱われ、他の画像に合成しても透過の設定は残ります。例で見てみましょう。
<?php $img = imagecreate(200,200); $colour1 = imagecolorallocate($img, 255, 0, 255); $colour2 = imagecolorallocate($img, 100, 90, 100); imagefilledrectangle($img, 0, 160, 200, 200, $colour2); $img2 = imagecreate(200,20); $colour4 = imagecolorallocate($img2, 255, 255, 255); $img3 = imagecreatefrompng("test.png"); $img4 = imagerotate($img4,90,$colour4,0); imagecopy($img,$img4,10,0,0,0,150,200); header('Content-Type: image/png'); imagepng($img); imagedestroy($img); imagedestroy($img2); imagedestroy($img3); imagedestroy($img4); ?> |
前回とほとんど変わらないプログラムです。新しく出てきた関数imagecreatefrompngはPNG画像を読み込んだキャンバスを作成するもので、他にimagecreategifなどもあるというのはご想像のとおりです。引数に同ディレクトリ内の透過色ありPNGを指定したのですが、結果このように表示されました。
(この部分の画像は000webhostに接収されてしまいました)
判りにくいのですが、元の透過PNGの透過設定が保持され、合成先画像のピンクの背景を突き抜けて透過しています。傾いた長方形の周囲の白い部分は、黒字の背景のページに設置すると黒になります。つまり合成先画像のカラーパレットと、透過色設定を含んだ合成元画像のカラーパレットを単純に結合したためこういう事態になっているということのようです。ちなみにimagerotate関数の引数4を0以外にしても見え方は変わりませんでした。
こうした仕様もあり、GDで複数の画像を合成して画像を作成する場合には、フルカラー画像を前提にしてプログラムを書いた方が予期せぬ壁に阻まれることがないだろう、という教訓も得られようというものです。