如何从 Android 中的大位图加载图块?
Posted
技术标签:
【中文标题】如何从 Android 中的大位图加载图块?【英文标题】:How to load tiles from a large bitmap in Android? 【发布时间】:2011-06-12 18:52:54 【问题描述】:如果我有一个通常会生成“内存不足”异常的大型位图文件,我如何将其加载为图块?例如我有一个 10,000x10,000 的图像,我想将其拆分为 1,000x1,000 像素的 10x10 网格。
我见过 Bitmap.createBitmap(sourceBitmap, x, y, width, height)
函数,但它需要我的大图像作为源输入。
如何在不完全加载输入图像的情况下从输入图像中获取图块?
【问题讨论】:
为什么不能将一张巨大的图片分成 16 个不同的图片? 因为我只是从用户的手机加载图像。 【参考方案1】:来自 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);
简单:)
【讨论】:
【参考方案2】:如果你很幸运,你可以找到一个可以从存储中加载图像块而不是加载整个图像的库。这取决于图像格式,以及可以读取的库。另外,该库可能会用 C 编写,因此您必须将其移植到 Java 或使用 NDK。
在将图像放置到手机上之前将图像分解成图块会更好。
如果这些选项都不适合你,我认为你不走运。
【讨论】:
您好,谢谢您,很遗憾,我无法控制与应用程序一起使用的图像。【参考方案3】:如果图像存储为压缩位图,则几乎不可能计算出图像的特定区域在文件中的位置。要查找特定区域,您将逐行解码,丢弃结果直到到达第 y 行。然后,您继续解码高度行,丢弃 X 坐标左侧和 X+宽度右侧的像素......如果您在大位图的底部进行平移,会非常慢。
从字里行间看,如果 'isShareable' 为真,则前面提到的 BitmapRegionDecoder() 似乎在后台执行此操作。否则它似乎可能会解压缩图像,并存储未压缩的副本。每个像素 1 个字节,保存 10,000x10,000 位图需要 100MB。
【讨论】:
以上是关于如何从 Android 中的大位图加载图块?的主要内容,如果未能解决你的问题,请参考以下文章
Android:从图库加载的位图在 ImageView 中旋转
BitmapRegionDecode.decodeRegion,尝试从位图创建图块时出现skia错误
如何在android中使用imageloader释放位图内存?