Lossless 対応完了
PNG 画像の吸出しに対応しました。
index 形式もそのまま (PNG で言う所の) PALETTE 形式に変換します。
- http://sourceforge.jp/projects/swfed/files/ swfed-0.04
サンプルコード
$obj = new SWFEditor(); $obj->input($swfdata); echo $obj->getPNGData($image_id);
実行結果
% php swfdump.phps game.swf # format=3 の画像を探す <略> [44] tag=DefineBitsLossless2(36) length=134 image_id=34 format=3 width=62 height=18 colormap_count=16 rgba colormap exists indices exists <略> % php swfgetpngdata.phps game.swf 34 > test2.png
% php swfdump.phps game.swf # format 5 の画像を探す <略> [91] tag=DefineBitsLossless2(36) length=58282 image_id=72 format=5 width=155 height=156 argb bitmap exists <略> % php swfgetpngdata.phps game.swf 72 > test.png
透明度付きで吸い出せてます。(^o^)/
…
という事はデータ構造の理解は正しいはずなので、
透明度付き PNG画像入れ替えに失敗しているのは、
libpng の使い方を間違えているかも。
libpng で PALETTE 形式を扱う方法
swfed の Lossless format=3 index 形式に対応する為、
libpng の PALETTE 形式の書き出し方を調査した時のメモ
color_palette=(png_colorp)NewPtr(sizeof(png_color)*num_palette); ctable=(*savePix)->pmTable; HLock((Handle)ctable); for (i=0; i<num_palette; i++) { color_palette[i].red=((*ctable)->ctTable[i].rgb.red)>>8; color_palette[i].green=((*ctable)->ctTable[i].rgb.green)>>8; color_palette[i].blue=((*ctable)->ctTable[i].rgb.blue)>>8; } png_set_PLTE(write_ptr,write_info_ptr,color_palette,num_palette);
パレットはこうして設定しつつ、データ本体は
image_rows = malloc( image_height * sizeof( BYTE *) ); for( i = 0; i < image_height; i++ ) { dest = image_rows[ i ] = malloc( bmp_line_byts ); src = &bmp_data[ (image_height - 1 - i) * bmp_line_byts ]; for( j = 0; j < bmp_line_byts; j++ ) { *dest++ = *src++; } } png_write_image( png_ptr, image_rows);
1 pixel 1 byte の生データを放り込むと。