Flash Player は 11.5+ でスレッドをサポートしました。
Worker Thread で Loader.loadBytes() を使用して画像を読み込みたい。
メインスレッドで生成される Image ByteArray。
しかし、私はそれを行うことはできません。
次のような SecurityError を受け取りました。
SecurityError: エラー #2123: セキュリティ サンドボックス違反: Loader.content: file:///E:/work/ASWorkSpace/test/bin-debug/test.swf は file:///E:/work/ASWorkSpace/test にアクセスできません/bin-debug/test.swf/[[DYNAMIC]]/1. アクセス権が付与されたポリシー ファイルはありません。
次のようにワーカースレッドを初期化します。
worker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);
リモートからのswfではなく、ローカルなどです
[Embed(source="../workerswfs/Thread.swf", mimeType="application/octet-stream")]
マニュアルで見つけました。「ロードされたコンテンツが画像の場合、SWF ファイルのドメインが画像のオリジン ドメインの URL ポリシー ファイルに含まれていない限り、セキュリティ サンドボックスの外部にある SWF ファイルからそのデータにアクセスすることはできません。」
私は解決策を得ました。loadByte() を 2 回実行すると、ByteArray ソースが「洗い流された」ように見えます。そのため、FlashPlayer は Worker Thread によって生成された ByteArray と見なされ、loader.content へのアクセスが許可されました。このような:
//Messages to the Main thread
protected function onMainToWorker(event:Event):void {
var msg:ByteArray = mainToWorker.receive() as ByteArray;
trace(msg.length);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bytesComplete);
var bytes:ByteArray = new ByteArray();
bytes.writeBytes(msg,0,msg.length);
loader.loadBytes(bytes);
}
private function loadedAagin(e:Event):void
{
var loader:Loader = (e.target as LoaderInfo).loader;
// Here we can access it.
var bmp:Bitmap = loader.content as Bitmap;
}
private function bytesComplete(e:Event):void
{
var loader:Loader = (e.target as LoaderInfo).loader;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, bytesComplete);
// var bmp:Bitmap = loader.content as Bitmap; It can not be accessed
// just loadBytes again, it seems "washed off" the ByteArray source
var newloader:Loader = new Loader();
newloader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadedAagin);
newloader.loadBytes(loader.contentLoaderInfo.bytes);
}
しかし、それはとても醜いですよね?誰か良い考えがありますか?