Альтернатива растровым данным для моментального снимка? - PullRequest
0 голосов
/ 04 июля 2011

В настоящее время я загружаю удаленный SWF через as3 (с политикой домена, чтобы разрешить все из этого домена - файл политики не может быть изменен мной самостоятельно), из которого я хочу сделать снимок.Проблема в том, что основной SWF, который я загружаю, загружает дочерние SWF из другого домена, у которого не включена политика разрешить все. Это заставляет функцию снимка вызывать ошибку «безопасности песочницы».Мне интересно, есть ли альтернатива функции рисования растровых данных для создания «снимка» без противоречия с безопасностью песочницы.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Если вам разрешено загружать данные из соответствующего домена, выполните следующие действия:

  1. загрузите SWF-файл как двоичные данные, используя URLLoader и URLLoaderDataFormat.BINARY
  2. загрузите двоичный контентв экранный объект, используя Loader и loadBytes ()

. После этого вы сможете draw() содержимое этого swf.

EDIT Пример этой техники.

Просто скопируйте и вставьте приведенный ниже код в пустой файл fla, скомпилируйте и поместите полученный SWF-файл где-нибудь поверх http (при локальном тестировании оба вызова draw () будут успешными, поэтому вы не увидите разницу).

import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.system.Security;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.text.TextField;
import flash.display.StageScaleMode;

var onBinaryComplete:Function = function (event:Event) : void
{
    trace("onBinaryComplete()");
    var loader:URLLoader = event.target as URLLoader;
    var bytes:ByteArray = loader.data as ByteArray;
    trace(bytes.length+" bytes");
    bytesLoader.loadBytes(bytes);
}

var onBytesComplete:Function = function (event:Event) : void
{
    trace("onBytesComplete()");
    var info:LoaderInfo = event.target as LoaderInfo;
    var bmp:BitmapData = new BitmapData(300, 300, true, 0x8000FF00);
    // this will not fail, you'll see an image
    bmp.draw(info.content);
    var bitmap = new Bitmap(bmp);
    bitmap.x += 100;
    bitmap.y += 100;
    stage.addChild(bitmap); 
}

var onDirectLoadComplete:Function = function (event:Event) : void
{
    trace("onDirectLoadComplete()");
    var bmp:BitmapData = new BitmapData(300, 300, true, 0x80FF0000);
    // this must fail, you'll get an exception
    bmp.draw(event.target.content);
    stage.addChild(new Bitmap(bmp));
}

var binaryLoader:URLLoader = new URLLoader();
binaryLoader.dataFormat = URLLoaderDataFormat.BINARY;
binaryLoader.addEventListener(Event.COMPLETE, onBinaryComplete);
binaryLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));

var bytesLoader:Loader = new Loader();
bytesLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesComplete);

var directLoader:Loader = new Loader();
directLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDirectLoadComplete);
directLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));

Загрузка данных crossdomain.xml: http://noregret.org/crossdomain.xml,, но вы не можете контролировать загруженный SWF-контент при его прямой загрузке.Загрузка байтов, а затем содержимое решает проблему.

1 голос
/ 04 июля 2011

Это почти то, для чего предназначена песочница. Таким образом, вы не можете делать снимки из данных, которые вам не принадлежат. Это слабый ответ, но , как показывают документы , единственный способ обойти это - использовать AIR.

Если у вас есть доступ к другому домену или вы знаете людей, управляющих им, вы можете разместить crossdomain.xml на их сайте.

0 голосов
/ 04 июля 2011

Вы можете загрузить ресурс через некоторый прокси (размещенный на вашем собственном сервере). Многие хостинговые компании не разрешают размещать какие-либо прокси-скрипты, даже если они предназначены для загрузки ресурсов для приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...