使用 ByteArray 加载时如何获取图像尺寸?
How to get image dimensions when loaded with ByteArray?
使用 AS3 和 AIR 我想在使用 ByteArray 加载图像后获得图像尺寸。使用下面的代码,我可以成功加载图像,甚至可以成功应用 scaleX/scaleY,但从加载器大小中得到零,因为 height/width。
private function listFiles():void{
imagesPath=layout.pathFld.text;
fileList=new Array;
var desktop:File = File.userDirectory.resolvePath(imagesPath);
var files:Array = desktop.getDirectoryListing();
for (var i:uint = 0; i < files.length; i++)
{
fileList.push(files[i].nativePath);
}
for (i = 0; i < fileList.length; i++)
{
layout.txtFld.appendText(fileList[i]+"\n");
}
loadOneImage();
}
private function loadOneImage():void
{
var f:String=fileList[counter];
bytes = new ByteArray();
myFileStream = new FileStream();
var myFile:File = File.userDirectory.resolvePath(f);
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.addEventListener(Event.COMPLETE, loadImage);
myFileStream.openAsync(myFile, FileMode.READ);
}
private function progressHandler(event:ProgressEvent):void
{
if (myFileStream.bytesAvailable)
{
myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
}
}
private function loadImage(e:Event):void
{
var loader:Loader = new Loader();
loader.loadBytes(bytes);
loader.scaleX=.05;
loader.scaleY=.05;
var ph:Number=loader.height;
var pw:Number=loader.width;
trace("ph/pw="+ph+"/"+pw);
// I GET ZEROS HERE
}
为了正确获取构造的 DisplayObject
的大小,请先将其添加到舞台。如果您不需要将它保留在舞台上,您可以在 space 四行代码中添加、获取大小、删除。此外,即使您执行 loadBytes()
,加载程序也会异步执行加载,因此您仍然必须在尝试获取大小之前侦听 Event.COMPLETE
。
要获取图像尺寸,您可以使用 Loader.contentLoaderInfo
,但正如@Vesper 所说,您必须等待它的 Event.COMPLETE
事件被触发,否则编译器将触发错误,因此您可以这样做:
var loader:Loader = new Loader();
loader.loadBytes(bytes);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onContentLoad);
function onContentLoad(e:Event):void{
trace('image width : ' + e.target.width);
trace('image height : ' + e.target.height);
}
希望能帮到你。
使用 AS3 和 AIR 我想在使用 ByteArray 加载图像后获得图像尺寸。使用下面的代码,我可以成功加载图像,甚至可以成功应用 scaleX/scaleY,但从加载器大小中得到零,因为 height/width。
private function listFiles():void{
imagesPath=layout.pathFld.text;
fileList=new Array;
var desktop:File = File.userDirectory.resolvePath(imagesPath);
var files:Array = desktop.getDirectoryListing();
for (var i:uint = 0; i < files.length; i++)
{
fileList.push(files[i].nativePath);
}
for (i = 0; i < fileList.length; i++)
{
layout.txtFld.appendText(fileList[i]+"\n");
}
loadOneImage();
}
private function loadOneImage():void
{
var f:String=fileList[counter];
bytes = new ByteArray();
myFileStream = new FileStream();
var myFile:File = File.userDirectory.resolvePath(f);
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.addEventListener(Event.COMPLETE, loadImage);
myFileStream.openAsync(myFile, FileMode.READ);
}
private function progressHandler(event:ProgressEvent):void
{
if (myFileStream.bytesAvailable)
{
myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
}
}
private function loadImage(e:Event):void
{
var loader:Loader = new Loader();
loader.loadBytes(bytes);
loader.scaleX=.05;
loader.scaleY=.05;
var ph:Number=loader.height;
var pw:Number=loader.width;
trace("ph/pw="+ph+"/"+pw);
// I GET ZEROS HERE
}
为了正确获取构造的 DisplayObject
的大小,请先将其添加到舞台。如果您不需要将它保留在舞台上,您可以在 space 四行代码中添加、获取大小、删除。此外,即使您执行 loadBytes()
,加载程序也会异步执行加载,因此您仍然必须在尝试获取大小之前侦听 Event.COMPLETE
。
要获取图像尺寸,您可以使用 Loader.contentLoaderInfo
,但正如@Vesper 所说,您必须等待它的 Event.COMPLETE
事件被触发,否则编译器将触发错误,因此您可以这样做:
var loader:Loader = new Loader();
loader.loadBytes(bytes);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onContentLoad);
function onContentLoad(e:Event):void{
trace('image width : ' + e.target.width);
trace('image height : ' + e.target.height);
}
希望能帮到你。