Lossless 対応完了

PNG 画像の吸出しに対応しました。
index 形式もそのまま (PNG で言う所の) PALETTE 形式に変換します。

サンプルコード

$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 の生データを放り込むと。

2010年4月26日 追記

↓Lossless フォーマットのまとめはこちら