内存有效的缩放图像方式

时间:2011-04-14 18:39:01

标签: android

我有一个应用程序,主要查看区域是WebView。

这是一项服务,用户也可以上传照片。但是,通过WebView和照片上传,我得到了一些OutOfMemoryErrors。

通常只需要在WebView中加载页面,然后只需尝试使用以下内容打开图像:

Bitmap bmp = BitmapFactory.decodeFile(path);

原因我需要打开文件,以便我可以缩小它以便在上传之前适合最大宽度/最大高度尺寸。

我甚至试过以抽样的方式打开它,类似于这里提到的:

Strange out of memory issue while loading an image to a Bitmap object

但是,在WebView中加载了复杂的网页时,在尝试打开图像时仍然会出现OutOfMemoryError。

有没有办法扩展它,可能使用另一个进程或其他东西,这是更有效的内存?

2 个答案:

答案 0 :(得分:2)

我很高兴你问,我正要为我自己的项目进行调查。

看起来BitmapFactory.Options是你的朋友,特别是BitmapFactory.Options.inSampleSize enter link description here。您可以使用BitmapFactory.decodeStream获取图片尺寸,而无需创建位图。

谷歌搜索显示了com.bristle.javalib.awt ImgUtil类;这些似乎是开源的(不知道许可证),并且是基于AWT的,因此可以在Android上运行。有趣的方法是ImgUtil.scalueImageToOutputStreamAsJPEG,它与Inp​​utSteam / OutputStream一起使用,因此可能有内存效率。

<强>更新

另一种方法是在/system/lib/libjpeg.so周围编写一个JNI包装器,它似乎是Android设备上的标准配置。此库适用于扫描线,因此可以使用内存。另一个优点是使用JNI应该比纯java更快。

希望这有帮助,

Phil Lello

答案 1 :(得分:0)

我遇到了类似的问题,并使用BitmapFactory.Option.inScale找到了可行的解决方案。您可以在此处找到详细信息:How do I scale a streaming bitmap in-place without reading the whole image first?