b-shock. Fortress

GDで透過PNGを扱う。

久しぶりの記事だが、何事もなかったかのように進めていく。

経緯

PHPで画像を扱う為には、

  • GDを使ったもの
  • ImageMagickを使ったもの

の主に2種類があると思うけど、今日の話題はGDのほう。

透過色(アルファチャネル)を含んだPNG画像のリサイズ(縮小)を行うと、透過色が失われて しまう現象に悩まされていた。

今回、アプリ本体はPHPで書かれているが、他言語から利用することも想定し、画像リサイズAPI (picon)はNode.jsで実装されている。
当初、この問題はAPI側の不具合と考えていて、Node.jsやImageMagickのことばかり調べていた が、実際にはAPI側は無関係だった。

画像リサイズAPIのクライアント(PHP)は、APIにファイルをPOSTしている。
このPOSTすべきファイルが、既にアルファチャネルを保持していなかったというわけ。

GDで透過PNGを扱う。

PHPの imagesavealpha 関数を実行し、 アルファチャネルを有効にする必要がある。
また、 imagealphablending を実行して、アルファブレンディングを解除する。

ひと通り書くと、以下の様な感じ。

このスクリプトと同じ階層に、 sample.png がある想定で。

おまけ

この修正を行ったクラスは、実際には以下の場所にある。
オレオレフレームワークのクラスのうちひとつ。

Image.class.php
241行目

以上、ご参考まで。