如何将动态加载的图像调整为flash(as3)

时间:2010-09-25 08:02:55

标签: actionscript-3 flash-cs4 image-scaling image-resizing

一旦动态调入图像并将其置于MC中,我很难找到合适的as3代码来调整图像大小。 我正在使用:

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

舞台最终会打开全屏(工作正常)所以我需要保持图像的原始尺寸比舞台大得多。

我需要做的是在装载时将其缩小到与舞台相同的高度,同时保持宽度成比例(哦和居中)。 我已经尝试了各种代码,但无法找到任何工作,因为我设法做的就是调整包含图像但不是图像本身的MC。 任何有关正确代码的指导都将非常感激。

我猜它就像

那样简单
 "myimage".x=600;

但是如果是这样的话,写出图像名称的正确方法是什么,正如我所写,这似乎是错误的。 非常感谢

9 个答案:

答案 0 :(得分: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);
   }

答案 1 :(得分: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);
  }
 }
}

答案 2 :(得分:3)

试试这段代码:

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

答案 3 :(得分:2)

你也可以在左边尝试Loader课程 http://www.greensock.com/loadermax/

他们在简化和优化方面做得很好。简化了加载过程,并在其上面提供了一些很好的补贴。

检查ImageLoader类 http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html

特别是如何在加载之前设置一堆可选的vars属性。

以下是文档中给出的示例的一个小摘录...

//create an ImageLoader:
 var loader:ImageLoader = new ImageLoader("img/photo1.jpg", 
 //here's the sweet part :)
 {name:"photo1", 
 container:this, 
 x:180, 
 y:100, 
 width:200, //here you could set the stageWidth for instance
 height:150, //and the stageHeight here
 scaleMode:"proportionalInside", //this one will definitely help you , check the docs!
 centerRegistration:true, 
 onComplete:onImageLoad});

答案 4 :(得分:1)

我上面的代码有很多错误,显然说不能使用嵌套的公共类或soemthing,所以我删除了包和公共函数,我得到了它使用这段代码

     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);
  }

甚至在那里添加了一些平滑。 我需要研究'因为我不确定公共和私人职能之间有什么区别?

另外一个问题是,我可以成功地动态加载图像,如果它们与加载它们的swf位于同一个文件夹中但是如果我尝试将图像保存在单独的文件中并用类似

的方式调用它们

var url:URLRequest ... etc(“stills / image1.jpg”);他们只是不会加载。看错了什么?

再次感谢您的帮助

答案 5 :(得分:0)

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

并且您不需要调整image.jpg文件本身的大小(并且您尝试解决它的方式将无效)。您可以改为调整加载程序的大小。

如果您查看了针对LoaderInfo的AS3文档,您将在最后找到一个示例,说明如何添加侦听器。 (注意,侦听器被添加到contentLoaderInfo对象,而不是Loader本身。)

然后,您可以使用事件处理程序进行调整大小。 AS3 Docs在initHandler中显示了一个示例,它只是跟踪一些东西。如果你做了loader.x = 600那么你就得到了你需要的东西。

答案 6 :(得分:0)

我正在查找如何调整图片大小,我找到了这个方便的库http://jacwright.com/blog/221/high-quality-high-performance-thumbnails-in-flash/

当闪光灯缩小图像时,当你将其调整为一半时,它的质量会达到最佳,然后保持一半的尺寸,直到达到所需的尺寸

图书馆为你做了所有这些

该网站有一些示例和指向其谷歌代码页的链接

可能不是你想要的,但它确实很好用

答案 7 :(得分:0)

我一直在努力解决这个问题,但是如果你正在使用AS3,只需将一个uiloader对象拖到舞台上并设置它的来源,最重要的是,将scaleContent属性设置为true ....

这对我来说很好,需要的代码更少:

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

答案 8 :(得分: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;