2007-12-03

將 JPG 檔案資料加入 SWF, 並讓 SWF 載入自己

Appending binary data of a JPG file to a swf file.
我們可以將 SWF 檔後接一個圖檔資料 (別的格式當然也行),然後再利用 SWF 讀取自己, 把圖秀出來。這樣做的優點是, 可以動態組合不同內容的 SWF, 而且包成一個檔, 攜帶方便。
找了 JPG 、 PNG 圖檔格式和 SWF 檔案格式, 如下:

Jpeg 檔案格式:
JPEG Header Information
JPG File Header Format

PNG 檔案格式:
怎樣才是好的 File Format Header
Designing File Formats

SWF 檔案格式:
Alexis' SWF Reference
SWF File Format Specification (內容有點舊)
Adobe 官方資料

然而由於無法直接從 SWF 檔頭得知壓縮後的 SWF 大小, 所以放棄使用原有檔案格式的標記,改用自己增加設定。以下是合併檔案的 PHP 語法:
<?php
$fw = fopen("merged.swf", "wb");
$fn0 = "read_self.swf";
$fn1 = "hippocampus.jpg";
$fr0 = fopen($fn0, "rb");
$fr1 = fopen($fn1, "rb");
$content0 = fread($fr0, filesize($fn0));
$content1 = fread($fr1, filesize($fn1));

fwrite($fw, $content0);
fwrite($fw, '-----'); // add a specific mark
fwrite($fw, $content1);

fclose($fr0);
fclose($fr1);
fclose($fw);
?>

載入自己的那個 FLA frame actions:
var MyUrl:String = new LoaderInfo().url;
var lastSlash:int = MyUrl.lastIndexOf("/");
var selfName:String = MyUrl.slice(lastSlash+1);

var urlr:URLRequest = new URLRequest(selfName);
var urll:URLLoader = new URLLoader;
urll.dataFormat = URLLoaderDataFormat.BINARY;
urll.load(urlr);
urll.addEventListener(Event.COMPLETE, loadFinished);

function loadFinished(e:Event):void {
var ba:ByteArray = urll.data;
while (true) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
break;
}
}
}
}
}
}

var ldr:Loader = new Loader;
var img_ba:ByteArray = new ByteArray;
ba.readBytes(img_ba);
this.addChild(ldr);
ldr.loadBytes(img_ba);
}

相關檔案下載

1 則留言:

JennyKuo 提到...

我想問一下,我透過loader載入了一個SWF檔到MovieClip之中,如果我想要知道這個SWF檔中總共有幾個影格,ActionScript3.0要怎麼寫??

FB 留言