Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 为什么有这么多记忆?_Android_Bitmap_Out Of Memory - Fatal编程技术网

Android 为什么有这么多记忆?

Android 为什么有这么多记忆?,android,bitmap,out-of-memory,Android,Bitmap,Out Of Memory,我有一个1000x1500像素的位图,我想在Android中制作一个可变副本 当我运行以下代码时 // int width = original.getWidth(); // 1000px // int height = original.getHeight(); // 1500px final Bitmap result = original.copy(original.getConfig(), true); original.recycle(); …我在copy行上得到一个OutOfMem

我有一个1000x1500像素的位图,我想在Android中制作一个可变副本

当我运行以下代码时

// int width = original.getWidth(); // 1000px
// int height = original.getHeight(); // 1500px
final Bitmap result = original.copy(original.getConfig(), true);
original.recycle();
…我在
copy
行上得到一个
OutOfMemoryError

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
ERROR/GraphicsJNI(419): VM won't let us allocate 6000000 bytes
为什么1000x1500像素位图的复制指令需要6MB(!)

如何以更高效的内存方式从不可变位图创建可变位图

编辑 返回可变位图。显然,从不可变位图创建可变位图的唯一方法是将其复制到新的可变位图中。对于1000x1500位图,这显然需要12MB(1000x1500x4x2),这会在大多数Android设备中导致OutOfMemory错误


那么,这个问题在Android中无法解决吗?

回答您的第一个问题:

1000*1500*32/8=6000000

(颜色信息为32位/像素)

回答你的第二个问题:你需要缩小图像的大小,或者分块处理,或者降低分辨率或颜色深度。

请告诉我正确的方向

原来的位图使用的是ARGB_8888,它要求每个像素32位,比这个特定应用程序需要的更多


将位图更改为RGB_565,每像素需要16位,将内存消耗减少了一半。

我使用了一个棘手的解决方法来避免OutOfMemory错误。 我注册了一个接收器,以便它在不同的进程上运行:

<receiver android:name=".ImageTransformReceiver"
             android:exported="true" android:process=":imageTransformProcess"/>

在接收器内,我执行昂贵的内存操作(加载两个大图像并将它们合并为一个)。我将结果图像写入文件中,并将广播发送回主进程,以引用结果图像文件路径


这只是一个黑客,允许您在一个应用程序中使用更多的操作系统内存。希望这有帮助。

从API级别开始,11 BitmapFactory。选项有一个布尔值“inMutable”,可以设置为生成可变位图


虽然这不会改变单个位图的内存使用,但它将使您不必在内存中存储两个副本。

1000像素×1500像素×4字节/像素除以(1024*1024)。。。大约57MB…谢谢。因此,如果位图不需要两倍的内存,就无法使其可变?我不知道有这样的方法。请看这个:如何减少颜色深度?是的,这个链接描述了我遇到的相同问题。