フラッシュのサイズの取得。

フラッシュのサイズの取得についてのメモですが、公開する以上は解り易くするため実例も用意しました。

フラッシュのサイズの取得・目次。

サイズに関するデータの在り処(ありか)。

フラッシュのフォーマットは一応公開されておりますが、フラッシュのサイズに関しては多くの画像フォーマット同様ヘッダ部分で調べられるようです。

ファイルの先頭からは以下のデータが並びます。

FWSの三文字( 3オクテット)
多くの画像形式同様、冒頭の文字列FWSでフラッシュである事を認識出来ます。
フラッシュのヴァージョンをバイナリで( 1オクテット)
例えば、ヴァージョンが9なら、[09]となります。
ファイルの総容量( 4オクテット)
下位オクテットから並ぶ、リトルエンディアンとなります。
表示上のサイズに関するビット列
これが調べたい情報です。
以下略

さて、問題のビット列は以下のようになっております。

尚、ビット形式のデータは上位ビットから切り出す事とします。

このデータ列に後続するデータは新たなオクテットから始めます。

また、単位はピクセル数ではなく、twitと呼ばれる値で、これは20分の 1ピクセルと見なせます。

従ってピクセル単位で取得する場合は、得られた値を20で割る事となります。

実際のサイズに関するデータは以下のようになります。

  1. 各データのビット数( 5ビット)
  2. 幅最小値
  3. 幅最大値
  4. 高さ最小値
  5. 高さ最大値

ここで、最小値最大値と二つの値がありますが、これはこのデータ形式が実際にフラッシュに使われる各画像のデータの大きさを表す際にも使われる共通の形式となっているためです。

フラッシュ全体の大きさとしては、最大値も最小値も同じ値のようです。

実際のスクリプト例。

Perlでのコーディング。

ここでは、Perlを用いてコーディングしてみました。

尚、現行のフラッシュでは圧縮する事も出来ますが、ここでは無圧縮のSWFファイルを扱うものと仮定してコーディングします。

open (F, 'hoge.swf') || die 'Not Found?';
binmode (F);
read (F,$data,41);    #データの最大値は41バイト。
close(F);
die "Illegal Format!" if substr($data,0,3) ne 'FWS';

$data=substr($data,8);
$i=ord($data) >> 3;
$d=unpack("B*",$data);

#幅。
$x=substr($d,$i+5,$i);
$x1=unpack('N',pack('B32',substr(('0' x 32).$x,-32,32)));
$x1=int($x1/20);

#高さ。
$y=substr($d,$i+$i+$i+5,$i);
$y1=unpack('N',pack('B32',substr(('0' x 32).$y,-32,32)));
$y1=int($y1/20);

#結果。
print "width : $x1\n","height: $y1\n";

ここでは、コマンドラインで実行するスクリプトとして書いているため、CGIなどで利用するには少し書き換える必要があるかも知れません。

実際の例。

実際にフラッシュをこのスクリプトで調べてみましょう。

今回、例として用いているフラッシュは幅190ピクセルズ、高さ530ピクセルズで、本文書ではこの箇所にそのフラッシュまたは同等のアニメーションGIF画像を埋め込んでおります。

このフラッシュを一行目に指定したスクリプトをコマンドラインで実行します。

"width: 190"、"height: 530"と正しく出力されました。


ページ外へのご案内。