我正在尝试为Android平台编写一个程序来处理图像。 请考虑以下事项:
Bitmap b = BitmapFactory.decodeFile(File imagePath) // 5mb picture is stored into memory as with 32bits of memory per pixel --> almost run out of memory
我想要更改此Bitmap中的像素,但由于某种原因,返回的Bitmap是不可变的。我想用b.copy复制它(Config config,boolean isMutable) 虽然我遇到了一个RuntimeExeception,说VM不会让我们分配blah blah字节的内存。 我的问题是,将是以下行
Bitmap mutable = BitmapFactory.decodeFile(File imagePath).copy(config, true);
分配更少的内存,因此可以安全地用于获取Bitmap的可变副本,因为没有对原始不可变Bitmap的引用? 这似乎有时可以完成这项工作,但我想解释一下,我只是在胡说八道,或者我正在做的是一个聪明的解决方法来完成我的任务。
答案 0 :(得分:2)
没有。复制方法在将不可变位图复制到可变位图时对其进行引用。此引用称为this
。所以你仍然可以同时引用这两个位图。
您可以传递给BitMapFactory Options
方法的decodeFile
对象具有inMutable
选项,这样可以完全避免不可变位图。
答案 1 :(得分:0)
第二种情况可能有效,因为它恰好足够快地清除了对第一个位图的引用,尽管它似乎应该不起作用,因为它们都是还活着的同时还活着。然而,5mb图片似乎正在推动它(它的分辨率是多少?)。请注意,应用程序可用的内存差异很大(主要取决于特定设备的屏幕分辨率),因此无论您正在做什么,都可能无法在其他较小的设备中使用。所以真正的问题是:你真的需要全尺寸位图吗?