0

我有一个在本地运行良好的 swf (AS3),但是当我将 swf 放在服务器上并在浏览器中运行时,它在尝试使用 draw 方法时崩溃:

var bmp:BitmapData=new BitmapData(ldr.width,ldr.height,true,0x00FFFFFF);
bmp.draw(ldr);

ldr 是一个加载器,此时已成功从其他服务器加载了 jpg。我可以将 ldr 添加到舞台并查看图像。到底是怎么回事?

4

2 回答 2

1

确保另一台服务器上的 crossdomain.xml 正确。

于 2010-01-21T04:42:41.567 回答
1

您必须将checkPolicyFileLoaderContext该方法的第二个(可选)参数load())设置true为以访问bitmapData从远程域加载的图像的 。

var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext(true);
loader.load(urlRequest, context)

访问BitmapData

使用类的load()方法加载图片时Loader,可以指定一个context参数,就是一个LoaderContext对象。如果checkPolicyFile将对象的属性设置LoaderContext为 true,Flash Player 会在从中加载图像的服务器上检查跨域策略文件。如果存在跨域策略文件,并且该文件允许加载的SWF文件所在的域,则允许该文件访问Bitmap对象中的数据;否则,访问被拒绝。

LoaderContext::checkPolicyFile

当您从调用 SWF 文件自己的域之外加载图像(JPEG、GIF 或 PNG)时,将此标志设置为 true,并且您希望需要从 ActionScript 访问该图像的内容。访问图像内容的示例包括引用 Loader.content 属性以获取 Bitmap 对象,以及调用 BitmapData.draw() 方法以获取已加载图像像素的副本。如果您在加载时未指定 checkPolicyFile 就尝试这些操作之一,您可能会收到 SecurityError 异常,因为尚未下载所需的策略文件。

Loader::load()

如果加载的内容是图像,则安全沙箱之外的 SWF 文件无法访问其数据,除非该 SWF 文件的域包含在图像源域的跨域策略文件中。

BitmapData::draw()

注意:源对象和(在 aSpriteMovieClip对象的情况下)其所有子对象必须来自与调用方相同的域,或者必须位于调用方可通过调用Security.allowDomain()方法访问的 SWF 文件中。如果不满足这些条件,则该draw()方法不会绘制任何内容并引发SecurityError异常。此限制不适用于应用程序安全沙箱中的 AIR 内容。

于 2010-01-21T08:03:30.800 回答