我有一个应用程序,主要查看区域是WebView。
这是一项服务,用户也可以上传照片。但是,通过WebView和照片上传,我得到了一些OutOfMemoryErrors。
通常只需要在WebView中加载页面,然后只需尝试使用以下内容打开图像:
Bitmap bmp = BitmapFactory.decodeFile(path);
原因我需要打开文件,以便我可以缩小它以便在上传之前适合最大宽度/最大高度尺寸。
我甚至试过以抽样的方式打开它,类似于这里提到的:
Strange out of memory issue while loading an image to a Bitmap object
但是,在WebView中加载了复杂的网页时,在尝试打开图像时仍然会出现OutOfMemoryError。
有没有办法扩展它,可能使用另一个进程或其他东西,这是更有效的内存?
答案 0 :(得分:2)
我很高兴你问,我正要为我自己的项目进行调查。
看起来BitmapFactory.Options是你的朋友,特别是BitmapFactory.Options.inSampleSize enter link description here。您可以使用BitmapFactory.decodeStream获取图片尺寸,而无需创建位图。
谷歌搜索显示了com.bristle.javalib.awt ImgUtil类;这些似乎是开源的(不知道许可证),并且是基于AWT的,因此可以在Android上运行。有趣的方法是ImgUtil.scalueImageToOutputStreamAsJPEG,它与InputSteam / 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?