• 通过FileReference打开本地图片崩溃的解决方法


    最近在做图片上传工具,于是就遇到了FileReference打开本地图片崩溃的问题,搜了下解决方法,得到以下文章:

    在Flash 9之前,含Flash 9,Flash无法实现本地图片预览的功能。Flash 10添加了FileReference.load方法,使得本地图片预览成了可能。使用流程:
    FileReference.browse(),FileReference.load(),以及Loader.loadBytes(FileReference.data),具体使用略过。
    这种使用流程存在一个问题,
    遇到大图片时,本地预览会存在比较严重的性能问题,预览一张3.5M的图片,内存升到60M,预览15张3M左右大小的图片时,内存飙升到500M,可能会引起用户浏览器崩溃。
    http://myadobe.ro/2008/11/24/filereference-the-end-of-upload-tyranny-guest-post-by-andrei-rosca/

    给出了解决方案。

    大致的思想是,在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中即可实现图片预览。


    上述方法只在Flash Player自身运行时有效,对于浏览器中加载swf预览本地图片,还需要做一个操作:
    (loader.contentLoaderInfo.content as Bitmap).bitmapData.dispose();

    //从内存中删除原图的bitmapData引用
    loader.unload();

    但是这个方法并未完全解决问题,经过观察发现第一次打开浏览器并打开第一张大图后必然发生崩溃,那么猜想可能是由于flash player内存空间不够,而FileReference的load方法载入文件后得不到足够的内存空间而引发崩溃。

    所以我的做法是在程序最开始加上如下代码:

    (new BitmapData(2000, 2000)).dispose();
    System.gc();

    创建一个足够大的位图来开辟flash player的内存。
    实践证明该方法管用!!

  • 相关阅读:
    URAL 2015 Zhenya moves from the dormitory(水题)
    概率DP总结(待整理)
    HDU 5236 Article(概率DP+贪心 待解决)
    2015上海邀请赛
    树链剖分(待整理)
    hust 5239 Doom(线段树 规律OR数论 待整理 )
    Java大数BigInteger BigDecimal
    hdu 5505 GT and numbers
    hdu 5532 Almost Sorted Array
    hdu 5533 Dancing Stars on Me
  • 原文地址:https://www.cnblogs.com/flash3d/p/2387759.html
Copyright © 2020-2023  润新知