公司要求用flah制作一个上传头像的工具,遇到的另外一个问题·一下是收集的答案·呵呵·不知道对你有帮助没有
FileReference.browse(),FileReference.load(),以及Loader.loadBytes(FileReference.da
这种使用流程存在一个问题,
遇到大图片时,本地预览会存在比较严重的性能问题,预览一张3.5M的图片,内存升到60M,预览15张3M左右大小的图片时,内存飙升到500M,可能会引起用户浏览器崩溃。
http://blog.zd178.com/zd178_look/uploadImg/给出了解决方案。大致的思想是,在Loader加载到图片数据后,做如下处理:
//make the image 50 px in height
var scale:Number=50/loader.height;
//and actually resize it
loader.width*=scale;
loader.height*=scale;
loader.width=Math.round(loader.width);
loader.height=Math.round(loader.height);
//use a container so we don’t need a matrix in BitmapData.draw
var container:Sprite=new Sprite();
container.addChild(loader);
//take the snapshot
var bmpData:BitmapData=new BitmapData(container.width,container.height);
bmpData.draw(container);
var bmp:Bitmap=new Bitmap(bmpData);
这样,相当于把图片按比例缩放之后,获取位图数据,转换为Bitmap对象,这样,只需要把Bitmap对象添加到Container中即可实现图片预览。
的FileReference的Flash 10的到来,得到了一些新的好东西。其实很多。
现在,我们可以从用户的数据访问不首先上传。一个双赢 – 双赢的局面。用户不必等待数据可用,我们不必担心带宽和负载时间(尽可能多)。
好,我们可以节省飞没有服务器的文件。
所以,让我们开始!
首先我们打开一个图像:
VAR imageFileRef的FileReference =新的FileReference();
/ /支持的图像类型
VAR imageTypes的FileFilter =新的FileFilter(“图像(*. JPG,*. JPEG,*. GIF,*. PNG)”,“*. JPG,*. JPEG,*. GIF,*. PNG”);
/ /用户选择一个文件
imageFileRef.addEventListener(Event.SELECT的LoadImage);
/ /加载文件
imageFileRef.addEventListener(Event.COMPLETE,resterImage);
imageFileRef.browse([imageTypes]);
/ /开始加载图像
功能的LoadImage(E:事件= NULL):无效
{
imageFileRef.load();
}
/ /从字节数组显示对象
resterImage功能(E:事件= NULL):无效
{
VAR装载机:装载机=新的Loader();
loader.loadBytes(imageFileRef.data);
调用addChild(装载机);
}
这是核心,我的演示应用程序的本质。使用的FileReference二进制文件 – 找到一种方法来读取 – 在我的演示图像。
虽然代码将在Flash IDE,FileReference.browse()在浏览器的安全限制。只有在响应用户交互,你可以调用浏览方法:点击鼠标或按键。
什么工程:MouseEvent的:单击“开始”,MOUSE_DOWN,MOUSE_UP KeyboardEvent.KEY_DOWN,KEY_UP。别的工作在Flash IDE,但在浏览器中运行时会抛出一个错误。
在我的演示,我有一个浏览按钮,触发的文件,选择弹出窗口:
browseBtn.addEventListener(MouseEvent.CLICK,browseFiles);
功能browseFiles(E:MouseEvent的):无效
{
imageFileRef.browse([imageTypes]);
}
接下来,我调查的潜在问题。它的情况并不少见有大的图像5 – 10MB。在Flash的内存解他们对用户计算机产生破坏性的影响。
我作为内存90MB解压9MB的测试图像。试想一下,会导致5-10图像。
调整图像的大小是一个简单的过程。我们将使用BitmapData.draw();
/ /从字节数组显示对象
resterImage功能(E:事件= NULL):无效
{
VAR装载机:装载机=新的Loader();
/ /
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,resizeImage);
loader.loadBytes(imageFileRef.data);
}
/ /使图像,体积小,非常小的..
功能resizeImage(事件:事件):无效
{
VAR信息的LoaderInfo =的LoaderInfo(event.target);
VAR装载机:装载机装载机(info.loader);
/ /图像高度50像素
VAR规模:= 50/loader.height;
/ /调整它的大小
loader.width *=规模;
loader.height *=规模;
loader.width = Math.round(loader.width);
loader.height = Math.round(loader.height);
/ /使用一个容器,所以我们不需要在BitmapData.draw矩阵
VAR容器:雪碧=新的Sprite();
container.addChild(装载机);
/ /快照
VAR bmpData的BitmapData =新的BitmapData(container.width,container.height);
bmpData.draw(容器);
VAR BMP位图=新的Bitmap(bmpData);
调用addChild(盒);
}
虽然我们最终有一个小图像,对内存的要求是相同的。
问题是原始数据属性的巨大形象的FileReference持有。这是一个读只有这样,我们不能将其删除。的文件没有提及任何方式卸载文件。
一些严重的疑虑后,我已经找到一种方法:
imageFileRef.cancel();
虽然没有记录,取消也清除数据的字节数组。
有。它的完成。您可以使用该图像的缩略图,你有一个的FileReference,如果你计划在下一步的图像上传和内存使用情况受到控制。
我们可以做什么?… …好吧,我们可以创建图像!
FileReference.save(),这是非常简单的。没有更多的服务器。没有更多的上传和下载!极乐!
请注意,除()具有相同的安全限制为浏览()。用户与您的应用程序进行交互。
/ /该地区将发挥我们的用户
VAR帆布:雪碧=新的Sprite();
功能SAVEFILE(E:MouseEvent的):无效
{
VAR saveFileRef的FileReference =新的FileReference();
/ /在画布上的快照
VAR bmpData的BitmapData =新的BitmapData(stage.width,stage.height);
bmpData.draw(帆布);
/ /从Flex中使用的编码器 - 或您选择的其他
VAR pngEncoder:PNGEncoder =新PNGEncoder();
/ /要求用户保存文件
saveFileRef.save(pngEncoder.encode(bmpData),“canvas.png”);
}
是不是漂亮吗?
厉害啊,网站也是自己做的吗?用的wordpress吗?