如果我有一个通常会产生“内存不足”异常的大型位图文件,我该如何将其作为图块加载?例如我有一个10,000x10,000的图像,我想把它分成10x10网格的1,000x1,000像素图块。
我见过函数Bitmap.createBitmap(sourceBitmap, x, y, width, height)
,但它需要我的大图像作为源输入。
如何在未完全加载输入图像的情况下从输入图像中获取图块?
答案 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。