トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   とにかくFLASH【FLASHに関して全般】
     swfmillでGIF画像の置換について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
961832p
Åê¹ÆNo.45160
投稿日時: 2010-6-8 20:03
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: swfmillでGIF画像の置換について
 
takemaru さん、返答ありがとうございました。ひとまず成功されたようで自分も嬉しいです。

引用:
ただ、上記の赤字の箇所、「不足分のパレットを0でパディングする」ということでしたが、
私が確認していたSWF&単色画像素材では、255でパディングすることで、完全一致の文字列生成ができました。
もちろん、0でパディングしての文字列生成及び生成文字列からの画像抽出、swfmillでの画像置換などは問題なくできました。
※961832pさんが確認に使用している素材でこちらでも確認しましたが、確かに0でパディングで完全一致しました。
この違いについての要因は、分かっていません。

表示に影響は無いとはいえ、気になったので自分も試してみる事に。
その結果、勘違いしている事がありました。自分はてっきりパレットデータのパディング処理は Adobe Flash がパブリッシュ時にやっているものだと思っていたのですが、よく見るとGIF画像ファイルの時点で既にパディングされていました(汗)。

試しにFireWorksやGIMP等いくつかのソフトでGIF画像を作ってみると確かにパディングデータが255のものもあり、ソフトによって違ってくるのかもしれません。GIFのフォーマット仕様書は見ていないので不確かですが、2の累乗数にパディングする事は決まっていても、中の値は決まってないという事なのかなと思いました。

ImageMagickが返すパレット数は実際に使われているパレット数だったようで、すっかり勘違いしていたのですが、幸いにもパディングデータを含む全パレットデータはImageMagickで取得できるようで、それを使うように処理の順番を少し変えてみました。

自環境で確認しただけなので、これらは普遍なものなのか微妙なところですが、これなら0と255をフラグで切り替えなくても大丈夫かもしれないと思いました。

----------------

以降は今回作ったサンプルに関するものです。データ生成部分はCGIと分離してあります。

 ・テストCGI ※ページ上部に広告がでます

【test_new.cgi】

use strict;

##swfmill用画像データ生成プログラムのパス
my $path_call = "./gif_to_definebitslossless_format3_for_swfmill.pl";
##GIF画像ファイルのパス
my @path_image = ( "./test_c32.gif", "./test_c49.gif" );
##
print qq{Content-type:text/html\n\n};
print qq{<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"></head>\n};
print qq{<body style="font-family:monospace; line-height:1.4;">\n};
##GIFファイルから生成されたswfmill用画像データを表示
foreach my $arg (@path_image) {
    ##パイプから受け取る
    open my $fh, "perl $path_call $arg |" or die;
    binmode $fh;
    my $swfmill_data = join q{}, <$fh>;
    close $fh;
    ##
    printf qq{<p>元画像:%s<br>swfmill用画像データ:%s<br>%s</p>\n},
      qq{<a href="$arg">$arg</a>},
      qq{<input style="width:75%;" type="text" value="$swfmill_data">},
      qq{<a href="$arg.swf.xml">オリジナルのXMLファイル</a>};
}
##
print qq{</body></html>\n};

__END__

【gif_to_definebitslossless_format3_for_swfmill.pl】

use strict;
use MIME::Base64;
use Compress::Zlib;
use Image::Magick;

##24ビットカラーへ戻すためのビット移動量
my $SHIFT_DEPTH = Image::Magick->QuantumDepth - 8;
##読み込むファイルパス(引数から)
my $path_image = shift @ARGV;
##パレット&ピクセルデータ格納用
my $data = q{};

#
# 画像の読み込み&各情報を取得
##
my $image = Image::Magick->new;
$image->Read($path_image);
my ( $width, $height, $colors ) = $image->Get( "width", "height", "colors" );

#
# パレットデータを格納
##(注)Image::MagickのGet("colors")は、実パレット数を返すもよう
##なので現在より大きく、かつ2の累乗数にして全てのパレット情報を得る
my @ppow_conv = ();
my $ppow      = 1;
for ( my $i = 0 ; $i < 256 ; $i++ ) {
    $ppow_conv[$i] = $ppow;
    $ppow <<= 1 if $ppow == $i;
}
##↓この処理をしない場合 → my $colors_now = $colors;
my $colors_now = $ppow_conv[$colors];
##
for ( my $i = 0 ; $i < $colors_now ; $i++ ) {
    my ( $r, $g, $b, $x ) = split ",", $image->Get("colormap[$i]");
    $data .= pack "CCC", $r >> $SHIFT_DEPTH, $g >> $SHIFT_DEPTH, $b >> $SHIFT_DEPTH;
}

#
# ピクセルデータを格納
##
my $padding = pack( "C", 0 ) x ( 4 - $width & 3 );
for ( my $y = 0 ; $y < $height ; $y++ ) {
    for ( my $x = 0 ; $x < $width ; $x++ ) {
        my $index = $image->Get("index[$x,$y]");
        $data .= pack "C", $index;
    }
    ##幅ピクセル数が4の倍数になるよう詰めもの
    $data .= $padding;
}

#
# swfmill画像データを生成&出力
##
##追加情報
my $add = q{};
$add .= pack "C", $colors_now - 1;
##(注)追加情報にはZLIBをかけない
my $data_swfmill = MIME::Base64::encode( $add . compress( $data, 9 ), q{} );
##
print "$data_swfmill\n";

__END__


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

« 1 (2)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops