如何将动态加载的图像调整大小到Flash(AS3)中

4

我正在努力寻找正确的AS3代码,在动态调用并放置在MC中的图像被加载到舞台后进行大小调整。 我正在使用以下方法进行加载:

var myLoader :Loader = new Loader(); 
mc.addChild(myLoader);
var url :URLRequest = new URLRequest("myimage.jpg"); 
myLoader .load(url );

舞台最终将开放到全屏(正常工作),因此我需要保持图像原始尺寸,该尺寸比舞台大得多。
我需要做的是在加载时将其缩小到与舞台相同的高度,同时保持宽度成比例(噢,还要居中)。 我尝试了各种代码,但无法找到有效的方法,因为我只能调整包含图像的MC而不能调整图像本身。 非常感谢任何正确代码的指导。
我猜想这就像某些简单的事情。
 "myimage".x=600;

但是如果是这样的话,正确的图片命名方式应该是什么?因为我写的好像有误。非常感谢。
Ed
9个回答

9
我尝试回答你的问题。
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.display.DisplayObject;
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.events.Event;

   var myLoader:Loader = new Loader(); 
   var image:Bitmap;
   var url :URLRequest = new URLRequest("im1.jpg");
   myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
   myLoader.load(url);

   function onImageLoaded(e:Event):void {
      image = new Bitmap(e.target.content.bitmapData);
      var mw:Number = stage.stageWidth;
      var mh:Number = stage.stageHeight;   
      /* if you set width and height image same with the stage use this */
      image.width = mw;
      image.height = mh;
      mc.addChild(image);
   }

3

您需要等待图像加载完成,然后才能调整加载器的大小,例如:

package {
 import flash.display.MovieClip;
 import flash.display.Sprite;

 import flash.display.DisplayObject;
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.events.Event;

 public class Test extends Sprite {

  public function Test(){
    super();

    if (stage) {
      init();
    } else {
     addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
    }
  }

  public var mc:MovieClip;

  private function init(e:Event=null):void{
   if (e!=null) {
     e.target.removeEventListener(e.type, arguments.callee);
   }

   mc = new MovieClip();
   addChild(mc);

   var myLoader:Loader = new Loader(); 
   mc.addChild(myLoader);

   // listen when the image is fully loaded
   myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);


   var url :URLRequest = new URLRequest("myimage.jpg"); 
   myLoader.load(url);
  }

  private function onImageLoaded(e:Event):void {
   var li:LoaderInfo = e.target as LoaderInfo;
   li.removeEventListener(e.type, arguments.callee);

   // resize the loader while preserving ratio
   var ldr:Loader=li.loader;
   var mw:Number = stage.stageWidth / ldr.width;
   var mh:Number = stage.stageHeight / ldr.height;

   var ratio:Number = (mw < mh) ? mw : mh;

   ldr.width *= ratio;  // you can also use ldr.scaleX=ratio;
   ldr.height *= ratio; // you can also use ldr.scaleY=ratio;

   // center mc on stage
   mc.x=0.5*(stage.stageWidth-mc.width);
   mc.y=0.5*(stage.stageHeight-mc.height);
  }
 }
}

3
尝试使用这段代码:

img1_mc.scaleX = (stage.stageWidth/img1_mc.width)
img1_mc.scaleY = (stage.stageHeight/img1_mc.height)

2
您还可以尝试Loader类,网址为http://www.greensock.com/loadermax/。它们能够极大地简化和优化加载过程,并提供了一些不错的额外功能。
请查看ImageLoader类http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html,特别是在加载前如何设置一系列可选变量属性。
以下是文档中给出的示例摘录:
//创建一个ImageLoader: var loader:ImageLoader = new ImageLoader("img/photo1.jpg", //这里是精华 :) {name:"photo1", container:this, x:180, y:100, width:200, //这里您可以设置stageWidth height:150, //以及stageHeight scaleMode:"proportionalInside", //这个肯定会对您有所帮助,请查看文档! centerRegistration:true, onComplete:onImageLoad});

1

我在上面的代码中遇到了很多错误,显然不能使用嵌套的公共类或其他什么东西,所以我删除了包和公共函数,并使用这段代码使其正常工作

     import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.display.DisplayObject;
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.events.Event;
   var myLoader:Loader = new Loader(); 
   mc.addChild(myLoader);
   myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
   var url :URLRequest = new URLRequest("im1.jpg"); 
   myLoader.load(url);
function onImageLoaded(e:Event):void {
   var bit:Bitmap = e.target.content;
    if(bit != null)
    bit.smoothing = true;
   var li:LoaderInfo = e.target as LoaderInfo;
   li.removeEventListener(e.type, arguments.callee);
   var ldr:Loader=li.loader;
   var mw:Number = stage.stageWidth / ldr.width;
   var mh:Number = stage.stageHeight / ldr.height;
   var ratio:Number = (mw < mh) ? mw : mh;
   ldr.width *= ratio;  // you can also use ldr.scaleX=ratio;
   ldr.height *= ratio; // you can also use ldr.scaleY=ratio;
   mc.x=0.5*(stage.stageWidth-mc.width);
   mc.y=0.5*(stage.stageHeight-mc.height);
  }

甚至加了一些平滑处理。 我需要学习,因为我不确定公共函数和私有函数之间的区别是什么?

还有一个问题,如果我尝试将图像保存在单独的文件中并使用类似于

var url:URLRequest...etc ("stills/image1.jpg"); 的方式调用它们,它们就无法加载。看到任何问题了吗?

再次感谢您的帮助。

Ed


你需要检查你的路径,它取决于你的图像目录是否在同一 SWF 目录下方或上方,如果在上方,你需要在路径前面添加 "../" 来向上移动一级。 - Patrick
这正是我想的,但我做不对。 文件夹如下: 在CLIENT文件夹中...我有 MY_swf_file(它加载图像) STILLS文件夹...里面有图像im1.jpg、im2.jpg等 所以当我调用图像到My_swf_file中时,它不应该只是"STILLS/im1.jpg"等吗?还是我需要"../STILLS/Im1.jpg"? - Edbro
同样,如果您通过 IIS 或 Apache 运行 swf 文件,可能会有所帮助,因为仅从编译中运行 swf 与从服务器运行不同。在本地运行 swf 时,某些功能可能无法正常工作,这可能是其中之一。 - MrB

0

我也遇到过类似的问题,你可以试试这个方法......对我很有效。

var my_loader:Loader = new Loader();
        my_loader.load(new URLRequest("underwater.jpg"));
        var holder:MovieClip=new MovieClip();
        my_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(){
my_loader.content.width = stage.stageWidth;
my_loader.content.height = stage.stageHeight;

0
我曾经为此苦苦挣扎,但如果你正在使用AS3,只需将uiloader对象拖到舞台上,并将其源和最重要的scaleContent属性设置为true即可......

这对我来说完全有效,需要的代码更少:

uiloader.autoLoad = true;
uiloader.scaleContent = true;
uiloader.source = "photos/yourphoto.jpg";

0

你需要添加一个监听器来监听你正在加载的INIT事件。

而且你不需要调整image.jpg文件本身的大小(以及你尝试解决它的方式是行不通的)。相反,你可以调整加载器的大小。

如果你查看LoaderInfo的AS3文档,你会在最后找到一个示例,展示了如何添加监听器。(请注意,监听器是添加到contentLoaderInfo对象上,而不是Loader本身)。

然后你可以使用事件处理程序来进行调整大小。AS3文档在initHandler中展示了一个示例,只是将一些内容输出到跟踪窗口。如果你执行loader.x = 600,那么你就会得到你需要的结果。


嗨,Stray 非常感谢您的回复和指引我正确的方向。 - Edbro

0

我刚查了一下如何调整图像大小,然后我找到了这个方便的库http://jacwright.com/blog/221/high-quality-high-performance-thumbnails-in-flash/

当Flash缩小图像时,如果你将其缩小一半,然后继续每次缩小一半直到达到所需大小,它会有最佳质量。

该库可以为您完成所有这些工作。

该网站有一些示例和链接到他的Google代码页面。

也许不完全符合您的要求,但它确实工作得非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接