如何从Android中的大位图加载切片?

时间:2011-01-20 21:48:30

标签: java android memory-management bitmap

如果我有一个通常会产生“内存不足”异常的大型位图文件,我该如何将其作为图块加载?例如我有一个10,000x10,000的图像,我想把它分成10x10网格的1,000x1,000像素图块。

我见过函数Bitmap.createBitmap(sourceBitmap, x, y, width, height),但它需要我的大图像作为源输入。

如何在未完全加载输入图像的情况下从输入图像中获取图块?

3 个答案:

答案 0 :(得分:18)

来自Is it possible to chop a bitmap to small pieces without loading the entire thing into memory?的Romain Guy的答案:

  

Android 2.3.3有一个名为的新API   android.graphics.BitmapRegionDecoder   这让你完全按照自己的意思行事   想。

     

你会做的   以下内容:

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);  
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);
     

简单:)

答案 1 :(得分:0)

如果你很幸运,你可以找到一个可以从存储中加载图像块而不是加载整个图像的库。这取决于图像格式,以及可用于读取的库。此外,该库可能是用C语言编写的,因此您必须将其移植到Java或使用NDK。

将放入手机之前,将图像分割成瓷砖会好得多。

如果这些选项都不适合你,我认为你运气不好。

答案 2 :(得分:0)

如果图像存储为压缩位图,则几乎不可能计算图像的特定区域在文件中的位置。要查找特定区域,您将逐行解码,丢弃结果,直到您到达y行。然后继续解码高度行,丢弃X坐标左侧和X +宽度右侧的像素....如果您在大位图的底部平移,则非常慢。

在行之间进行读取,如果'isShareable'为真,前面提到的BitmapRegionDecoder()似乎在后台执行此操作。否则,它似乎可以解压缩图像,并存储未压缩的副本。每像素1个字节,占用10,000x10,000位图需要100MB。