giftransmask

gifovlap の実験用素材を作るのに、giftransmask を作成しました。
丁度、ming に付属している gif2mask の逆に近い動作*1をします。

giftransmask foo.gif baa.alpha > baz.gif

とすると、baa.alpha αチャネル情報を元に goo.gif に透明pixelを上書きした baz.gif が生成されます。

Flash からマスク付き画像を抜き出す

swfed と組み合わせると以下のような感じで使えます。
まず抜き出したい画像を探します。


Flash の SWF ファイルを放り込んだ後、左上の画像一覧のリンクを辿ります。

透明度付きの画像は DefineBitsJPEG3(35) が相当するので、例えばその中から 298 を選ぶと、以下のコマンド*2を用いてデータを抜き出せます。

php swfgetjpegdata.phps      chara.swf 298 > chara-298.jpg
php swfgetjpegalphadata.phps chara.swf 298 > chara-298.alpha

それから、適当なツール*3chara-298.jpg を変換して chara-298.gif にします。
あと、何とかして 透明=on で保存してください…*4 ごめんなさい。ごめんなさい。

そして giftransmask を実行。

giftransmask chara-298.gif chara-298.alpha > chara-298-trans.gif

やったーっ!

プログラム

コンパイル

gcc -O2 -o giftransmask giftransmask.c -lgif

制限事項

入力元に transparent 対応 *5 フォーマットでない GIF を指定してもダメです。

  • transparent index を 0xff 決め打ちにしてるので 256 色全部使ってる画像だと問題あり
  • アニメーションGIF 未対応。1枚目のフレームだけ適用します。

そのうち何とかします…

*1:と思ってましたが全然違う処理でした。○rz gif2mask の方は画像の明るさ( max(red,green,blue) )を zlib 圧縮したデータです。

*2:swfgetjpegdata.phps, swfgetjpegalphadata.phps は swfed/samples/ の下にあります。

*3:Photoshop で GIF 保存 > 強制=なし、ディザ=誤差拡散法、同一色の保持=off。お勧

*4:透明度 on でないと処理できないのは、giftransmask の今の所の制限事項です。