1

这个问题已经跟踪我将近一年了,我想杀了它,为了我,为了所有人。

我正在处理一些需要从客户网站加载图像以进行显示的横幅广告。当我尝试使用 AS2 执行此操作时,我发现 AS2 不允许您这样做。这是语言中的一个错误。本地服务器上有图片的变通方法,但是从加载的图像不允许共享它们的 BitmapData,因此这些变通方法不起作用。在将头撞在桌子上并诅咒 Macromedia 大约两个月后,我最终投降了。

现在我们正在谈论迁移到 AS3(最终),我真的很兴奋。或者,我真的很兴奋,直到我开始对图像质量进行一些测试,发现这里的图像质量几乎没有变化。这是我对 AS2 试验的重复:一切都在 IDE 中完美加载,我很兴奋,我将 swfs 移动到测试服务器以在线运行它们,然后 POOF - jaggies。到处都是锯齿。

我已经在网上阅读了许多解决方案,但没有一个有效。它们包括:

  • 将 target.content.smoothing 设置为“true”。在 IDE 中运行良好。所有改进都在浏览器中消失。

  • 将 target.scaleX = target.scaleY 设置为 1.01。它只是打破了瑞士法郎。

  • 在加载命令的参数中添加“new LoaderContext(true)”。什么也没做。

  • 将 target.content.pixelSnapping 设置为“始终”。在 IDE 中看起来很完美,而不是在浏览器中。

  • 设置 crossdomain.xml 文件。图像正在显示 - 它们正在被加载,即使是锯齿状的,所以客户端服务器上必须有一个正常工作的跨域文件,对吗?

所以现在我只是卡住了,心碎了。谁能提供有关我的代码的见解,以及为什么它的渲染效果可能不如应有的精美?这是我正在制作的快速演示的客户端安全版本(仅删除了图像 URL,其他一切都与现在一样):

import flash.events.Event;

function completeHandler(e:Event) {
    e.target.content.pixelSnapping = "always"; 
    e.target.content.smoothing = true;
}

var imgurl:String = "CLIENT'S IMAGE URL HERE";

var imageLoader01:Loader = new Loader();
var image01:URLRequest = new URLRequest(imgurl);
imageLoader01.load(image01);
imageLoader01.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
addChild(imageLoader01);
imageLoader01.x = 2;
imageLoader01.y = 0;
imageLoader01.scaleX = imageLoader01.scaleY = .6;

var imageLoader02:Loader = new Loader();
var image02:URLRequest = new URLRequest(imgurl);
imageLoader02.load(image02);
imageLoader02.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
addChild(imageLoader02);
imageLoader02.x = 100;
imageLoader02.y = 80;
imageLoader02.scaleX = imageLoader02.scaleY = .308;

var imageLoader03:Loader = new Loader();
var image03:URLRequest = new URLRequest(imgurl);
imageLoader03.load(image03);
imageLoader03.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
addChild(imageLoader03);
imageLoader03.x = 200;
imageLoader03.y = 180;
imageLoader03.scaleX = imageLoader03.scaleY = .152;

var bannerLegend:legend = new legend(); 
addChild(bannerLegend);

非常感谢您提前。任何帮助将不胜感激。

更新:这是 HTML 嵌入代码:

<div id="swf_mr_sc_wt_si"></div>

<script type="text/javascript">
<!--
var swfurl = "http://DOMAIN_WITHELD_SORRY/static/AS3.swf?m=DEFAULT&t=" + (new Date().getTime());
swfobject.embedSWF(swfurl, "swf_mr_sc_wt_si", 300, 250, "8.0.0", "");
// -->
</script>

<p>

希望这可以帮助。

进一步更新:我们未在 crossdomain.xml 文件中列出。但是我们仍然可以加载锯齿状的图像。这些图像,当加载到在 IDE 中运行的同一个 swf 中时,是平滑的。我想我在这里缺少对某种杜撰知识的理解,因为我读到的所有内容都表明我能够做到这一点。这非常令人困惑。

4

1 回答 1

3

这是因为您正在加载的图像位于另一个域中,并且该域的 crossdomain.xml 不包含 .swf 所在的域,基本上给了 .swf 访问图像像素数据的“权限”(是的,只是在从另一个域加载的图像上启用平滑需要与使用 BitmapData.draw() 读取像素数据时相同的安全性,这有点奇怪)。在本地安全沙箱中运行时,限制更加宽松,这就是它在 IDE 中运行的原因。

即使您的域crossdomain.xml 中的批准域中,您也可能需要通过在加载图像时new LoaderContext(true)作为第二个参数发送来告诉 Flash Player 检查策略文件。Loader.load()

编辑:我最初认为使用 loadBytes() 是一种解决方法,但事实证明并非如此。我已删除该示例代码

于 2013-09-02T17:51:27.153 回答