如何将动态加载的图像调整为闪存(as3)
Posted
技术标签:
【中文标题】如何将动态加载的图像调整为闪存(as3)【英文标题】:How to resize dynamically loaded image into flash (as3) 【发布时间】:2011-04-17 02:50:01 【问题描述】:一旦图像被动态调用到舞台并放置在 MC 中,我正在努力寻找正确的 as3 代码来调整图像大小。 我正在加载:
var myLoader :Loader = new Loader();
mc.addChild(myLoader);
var url :URLRequest = new URLRequest("myimage.jpg");
myLoader .load(url );
舞台最终会全屏打开(工作正常),所以我需要将图像保持在比舞台大得多的原始尺寸。
我需要做的是在加载时将其缩小到与舞台相同的高度,同时保持宽度成比例(哦并将其居中)。 我尝试了各种代码,但找不到任何工作,因为我所做的只是调整包含图像的 MC 的大小,而不是图像本身。 任何有关正确代码的指导将不胜感激。
我猜它就像这样简单
"myimage".x=600;
但是如果是这样,那么写图像名称的正确方法是什么,正如我所写的那样,这似乎是错误的。 非常感谢
埃德
【问题讨论】:
【参考方案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();
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);
【讨论】:
【参考方案2】:您必须等待图像加载完毕,然后您可以调整加载器的大小,例如:
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)
【讨论】:
【参考方案4】:您也可以通过 http://www.greensock.com/loadermax/
尝试 Loader 类他们在简化和简化加载过程方面做得很好,除此之外还有一些不错的好处。
检查 ImageLoader 类 http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html
特别是如何在加载之前设置一堆可选的 vars 属性。
这是文档中给出的示例的一小部分摘录...
//创建一个ImageLoader: var loader:ImageLoader = new ImageLoader("img/photo1.jpg", //这是甜蜜的部分:) 名称:“照片1”, 容器:这个, x:180, 是:100, width:200, //这里你可以设置 stageWidth 例如 height:150, //这里还有stageHeight scaleMode:"proportionalInside", //这个肯定会帮助你,检查文档! 中心注册:真, onComplete:onImageLoad);【讨论】:
【参考方案5】:我在上面的代码中有很多错误,显然是说不能使用嵌套的公共类或某些东西,所以我删除了包和公共函数,并让它与这段代码一起工作
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");他们只是不会加载。看出什么不对了吗??
再次感谢大家的帮助
埃德
【讨论】:
你必须检查你的路径,这取决于你的图像目录在同一个 swf 目录下或更高的目录下,如果高于你必须在你的路径中添加“../”才能上一层 这就是我的想法,但无法做到。文件夹如下: 在 CLIENTfolder ...我有 MY_swf_file(加载图像) STILLSfolder ...里面是图像 im1.jpg、im2.jpg 等,所以当我将图像调用到 My_swf_file 时,它不应该只是“ STILLS/im1.jpg”等还是我需要“../STILLS/Im1.jpg ?? 另外,如果您通过 IIS 或 Apache 运行 swf 文件可能会有所帮助,因为仅从编译运行 swf 与从服务器运行它不同。在本地运行 swf 时,有些事情不起作用,这可能是其中之一。【参考方案6】:您需要添加一个侦听器来侦听您正在加载的内容的 INIT 事件。
而且您不需要调整 image.jpg 文件本身的大小(而且您尝试解决它的方式也行不通)。您可以改为调整加载器的大小。
如果您查看 LoaderInfo 的 AS3 文档,您会在末尾找到一个示例,该示例显示了如何添加侦听器。 (注意,监听器被添加到 contentLoaderInfo 对象,而不是 Loader 本身)。
然后您可以使用事件处理程序来调整大小。 AS3 文档在 initHandler 中显示了一个示例,该示例仅跟踪了一些内容。如果你做了 loader.x = 600 那么你会得到你需要的。
【讨论】:
HI Stray 非常感谢您的回复,让我朝着正确的方向前进。【参考方案7】:我只是在查找如何调整图像大小,发现了这个方便的库http://jacwright.com/blog/221/high-quality-high-performance-thumbnails-in-flash/
当 Flash 缩小图像大小时,将其大小调整一半时它具有最佳质量,然后继续调整大小一半直到达到所需大小
图书馆为你做所有这些
该网站有一些示例和指向他的 google 代码页的链接
可能不是你想要的,但它确实很好用
【讨论】:
【参考方案8】:我为此苦苦挣扎了一段时间,但如果您使用的是 AS3,只需将 uiloader 对象拖到舞台上并将其设置为源,最重要的是,将 scaleContent 属性设置为 true....
这对我来说很好,并且需要更少的代码:
uiloader.autoLoad = true;
uiloader.scaleContent = true;
uiloader.source = "photos/yourphoto.jpg";
【讨论】:
【参考方案9】:我也有这样的问题,你可以试试这个.....它对我有用
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;
【讨论】:
以上是关于如何将动态加载的图像调整为闪存(as3)的主要内容,如果未能解决你的问题,请参考以下文章