AS3:如何确定平滑从外部服务器加载的位图图像

时间:2013-09-02 09:06:46

标签: image actionscript-3 flash bitmap

这个问题一直跟着我差不多一年了,我想为了我而为了所有人而杀了它。

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

现在我们正在谈论转移到AS3(最后),我真的很兴奋。或者,在我开始对图像质量进行一些测试之前,我感到非常兴奋,并发现这里发生的图像质量变化很小。这是我对AS2试验的重复:一切都在IDE中完美加载,我感到非常兴奋,我将swfs移到测试服务器上以在线运行它们,以及POOF - jaggies。到处都是Jaggies。

我在线阅读了许多解决方案,但都没有。它们包括:

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

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

  • 将“new LoaderContext(true)”添加到我的load命令参数中。什么都不做。

  • 将target.content.pixelSnapping设置为“always”。在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运行时,这些图像是平滑的。我想我在这里缺少对某种伪造知识的理解,因为我读到的一切都指向我能够做到这一点。这非常令人困惑。

1 个答案:

答案 0 :(得分:3)

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

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

编辑:我原本以为使用loadBytes()会是一种解决方法,但事实证明并非如此。我删除了该示例代码