小池です。 

さっそくですが、携帯サイトなどを制作しているとサーバーサイドでswfmillを使用して
Flash内の画像データを動的に差し替えることがあるかと思います。

以前、透過GIF画像を差し替える際になかなかうまくいかず苦労したので、備忘録として記載します。
何かの参考になれば幸いです。

 

透過GIFデータはFlash中でDefineBitsLossless2というフォーマットで格納されており、
透過GIFのバイナリ画像からDefineBitsLossless2に変換してやる必要があります。

//  GIFデータの読み込み

$im = imagecreatefromstring($gifData);
$size_x = imagesx($im);
$size_y = imagesy($im);
$transId = imagecolortransparent($im);
$color_map_count = imagecolorstotal($im);
       
/*
 * MAKE COLORMAP
 */
$colormap = array();
for ($i=0; $i<$color_map_count; $i++) {
    if ($transId == $i) {

        // 透過色だった場合
        $colormap[] .= pack('C', 0);
        $colormap[] .= pack('C', 0);
        $colormap[] .= pack('C', 0);
        $colormap[] .= pack('C', 0);
    } else {
        $v = imagecolorsforindex($im, $i);
        $colormap[] .= pack('C', $v['red']);
        $colormap[] .= pack('C', $v['green']);
        $colormap[] .= pack('C', $v['blue']);
        $colormap[] .= pack('C', 0xFF);
    }
}
       
/*
 * MAKE INDICES
 */
$i = 0;
$indices_data = array();
for ($y=0; $y<$size_y; $y++) {
    for ($x=0; $x<$size_x; $x++) {
        $color_index = imagecolorat($im, $x, $y);
        $indices_data[$x+$y*(($size_x + 3) & -4)] = pack('c', $color_index);
    }
}
       
/*
 * ENCODE
 */
$base64data = base64_encode(gzcompress(implode('',$colormap).implode('',$indices_data)));
$bitlossless2_data = str_replace("¥n", "", $base64data);
$color_map_count = $color_map_count-1;

 

上記のような感じでカラーマップカウントとlossless2フォーマット画像を作成します。
このデータをswfmillを使って置きかえることで透過GIF画像もSWF内に自由に配置することができます。

参考:SWFフォーマットについて

http://www.adobe.com/devnet/swf/
https://secure.m2osw.com/swf_tag_definebitslossless2