Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android BitmapFactory将流解码为文件。或者如何在不杀死VM的情况下处理位图?_Android_Android Image - Fatal编程技术网

Android BitmapFactory将流解码为文件。或者如何在不杀死VM的情况下处理位图?

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;

我在解码图像时遇到OOM错误。这条信息就在我所面对的金钱上:

我想我知道什么可以解决我的问题,但不知道如何解决。现在,当我调整图像大小时,我得到的位图如下所示:

//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不起作用,但如果您发现其他任何问题,请通知我们。