IO_SWF 2.2.9 をリリースしました
swfextract.php で展開する JPEG に透明度がある場合に、透明度のみを抜き出した alpha ファイルと、JPEG画像にその透明度を混ぜた PNG ファイルを出力するようにしました。
コード
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)で取り出すという黒魔術っぽい処理してます。
しばらく触っていないと自然とやってた事も忘れますね。