2011-06-16 63 views
0

我读了很多关于inSampleSize OutOfMemory困境的讨论。
不能得到一个好的解决方案,所以我问一个关于它的问题。
我目前正在加载一个位图inSampleSize = 4。
这将给我一个大小为648x388的位图。
原始磁盘大小为2592x1592。我在648x388位图上写文本并将其保存回磁盘。
我写在648x388因为2592x1592给我OutOfMemory。android如何加载/保存原始大小位图没有OutOfMemory

它的工作方式是可以将1-10个648x388位图保存在while循环中。
我想改变这个循环来保存1-10 2592x1592位图。

我该如何安全地加载2592x1592?
我不在乎分辨率下降60%或更多。
只要位图具有相同的大小2592x1592。
有没有一种方法可能会保持大小,但使位图变薄,
去除颜色没有使质量不好。

我首先想到的是要像这样的东西来获得最大的位图我能得到: 我没有测试过这一点,但得到的感觉这是一个糟糕的方式

boolean work = true; 
int insample = 2; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
while(work){ 
    try{ 
    options.inSampleSize = insample; 
     bitmap = BitmapFactory.decodeFile(filePath,options); 
     work = false; 
    }catch(Exception e){ 
     insample++; 
    } 
} 

任何帮助将是篦。

回答

2

图像处理需要大量的内存。你不能使用整个位图,只需在你的手机上修改它。为此,使用Web服务。上传,处理,下载。对不起,没有其他方式解码位图只需要很多内存。

顺便说一句,你不能捕捉outOFMemory异常。该应用程序只是崩溃。

+0

谢谢@DArkO的回答。有趣的..如果我不能使用Web服务有一些方法来使位图变薄,但保持相同的大小2592x1592。无论如何,我猜想我必须加载它,并击中OOM。 – Erik 2011-06-16 18:21:57

+0

分辨率实际上是一个位图中有多少像素(一个维度是指单个线宽和多个像素分别存在多少个像素)。所以位图对象保存了它所有的像素。通过缩小尺寸,可以减少像素数量并降低分辨率。这很简单。我曾经使用过图像,没有办法处理没有内存使用的大型图像(认为像photoshop这样的软件,处理器和RAM内存昂贵,想象将这种东西装入16兆内存中,这是不可能的。抱歉) – DArkO 2011-06-16 18:32:54

+0

谢谢你的煽动。 必须找到一些可以访问sdcard上的位图和购买某种分辨率的android库api。这应该不难,我猜 – Erik 2011-06-16 18:38:15

1

Android中的进程大小有一个严格的限制,一个像素四个字节的4百万像素图像将自己(在许多设备上)全部打开,没有任何空间用于您的程序。

我认为你将需要做以下两件事之一:创建一个Web服务来在服务器上/在云中执行图像处理;或通过直接操作数据而不是使用位图来学习“即时”处理图像处理。

+0

感谢@antlersoft,“即时”操作可能是我的解决方案。也许我可以在SD卡上操作位图,使其更小但保持大小。你怎么看? – Erik 2011-06-16 18:33:24

相关问题