android如何加载/保存原始大小的Bitmap没有OutOfMemory

时间:2011-06-16 17:58:14

标签: android bitmapfactory

我读了很多关于inSampleSize OutOfMemory困境的讨论 无法得到一个好的解决方案,所以我问一个问题。
我当前正在加载一个inSampleSize = 4的位图 这将给我一个大小为648x388的位图 原始磁盘大小为2592x1592。

我在648x388位图上写文字并将其保存回磁盘 我在648x388上写,因为2592x1592给了我OutOfMemory。

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

如何安全地装载2592x1592?
我不关心决议下降60%或更多 只要位图具有相同的大小2592x1592 有没有办法可以保持大小,但使Bitmap更薄,
在不降低质量的情况下去除颜色。

我的第一个想法就是这样,以获得我能得到的最大位图: 我没有对此进行测试,但感觉这是一种不好的方式

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 个答案:

答案 0 :(得分:2)

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

顺便说一句,你无法捕获一个outofMemory Exception。该应用程序崩溃。

答案 1 :(得分:1)

Android中的流程大小存在严格限制,四个字节的四百万像素图像会自动(在许多设备上)完成所有这些操作,无需为您的程序留出任何空间。

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