IO_SWF 2.2.9 をリリースしました

swfextract.php で展開する JPEG に透明度がある場合に、透明度のみを抜き出した alpha ファイルと、JPEG画像にその透明度を混ぜた PNG ファイルを出力するようにしました。

ChangeLog

  • swfextract.php で透明度つきJPEGPNGで保存する。
  • Lossless2PNG に static 修飾を追加。

コード

    static function bitmapAlpha2PNG($bitmapdata, $bitmapalpha) {
        $im = imagecreatefromstring($bitmapdata);
        $width = imagesx($im);
        $height = imagesy($im);
        imagesavealpha($im, true);
        imagealphablending($im, false);
        $i = 0;
        for ($y = 0 ; $y < $height ; $y++) {
            for($x = 0 ; $x < $width ; $x++) {
                $c = imagecolorat($im, $x, $y);
                $rgba = imagecolorsforindex($im, $c);
                $red   = $rgba['red'];
                $green = $rgba['green'];
                $blue  = $rgba['blue'];
                $alpha = 127 - ord($bitmapalpha[$i])/2;
                $i++;
                $color = imagecolorallocatealpha($im, $red, $green, $blue, $alpha);
                imagesetpixel($im, $x, $y, $color);
            }
        }
        ob_start(); // ---- stdout to memory
        imagepng($im);
        $pngdata = ob_get_contents();
        ob_end_clean(); // ----
        imagedestroy($im);
        return $pngdata;
    }
  • あ、imagedestroy 忘れてた。。次の 2.3.1 で有効になります。

手間取った事

  • imagesavealpha は覚えていたけど、imagealphablending で false 指定しないと全部透明になってしまうのは忘れてた。
  • alphadata[$i] で参照するとバイナリ1文字が抜けるので数値として参照すると 0 ばかりになる。ord つけるのを忘れていた。
  • GD には画像バイナリ出力する機能がないので、ob_start で標準出力をバッファに貯めて、ob_get_contents でバイナリ(string)で取り出すという黒魔術っぽい処理してます。

しばらく触っていないと自然とやってた事も忘れますね。