Android BitmapFactory将流解码为文件。或者如何在不杀死VM的情况下处理位图?
我在解码图像时遇到OOM错误。这条信息就在我所面对的金钱上: 我想我知道什么可以解决我的问题,但不知道如何解决。现在,当我调整图像大小时,我得到的位图如下所示:Android BitmapFactory将流解码为文件。或者如何在不杀死VM的情况下处理位图?,android,android-image,Android,Android Image,我在解码图像时遇到OOM错误。这条信息就在我所面对的金钱上: 我想我知道什么可以解决我的问题,但不知道如何解决。现在,当我调整图像大小时,我得到的位图如下所示: //Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; o2.inDither=false;
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
o2.inDither=false; //Disable Dithering mode
o2.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
o2.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
o2.inTempStorage=new byte[32 * 1024];
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file), null, o2);
然后我需要将其保存回文件:
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
如您所见,我的目标是减少存储中的映像
现在—当我操作大位图时—我将大文件加载到内存中,这会增大堆的大小,然后在下一次尝试时—我会出现OOM异常,因为本机堆中没有足够的内存
所以,我想从BitmapFactory中获取流,并以某种方式将其传递到FileStream中进行存储。这将消除虚拟机堆问题,如果我想要大的图像
有人知道怎么做吗?在完成一个位图后,但在加载下一个位图之前,请尝试呼叫。这没有帮助。我对这些东西很小心。创建位图对象时出现问题。。我需要一种流解析程序,它帮不上忙?如中所示,您正在调用
recycle
,但这并没有改善内存配置文件?我从未看到VM堆下降。例如,我创建位图-它将VM堆推上,然后我循环使用位图。我确实得到了内存,但VM堆仍然分配给我的应用程序。例如,VM堆=5mb,实际使用的内存=3mb。然后我加载大位图-堆高达9mb,循环使用后-内存回到3mb,但堆保持9mb,好吧,你真的无法从应用程序代码控制堆大小。据我所知,没有现成的框架界面可以满足您的需要:要调整位图的大小,您需要将整个位图加载到内存中,因为我看不出,如果不付出惊人的努力,如何调整部分加载的图像的大小(调整大小通常需要某种形式的采样或插值,通常需要加载多个点)。如果recycle
调用允许您继续加载更多图像,而OOM不起作用,但如果您发现其他任何问题,请通知我们。