如何从 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释放位图内存?

Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?

如何从 android 中的 sdcard 图像创建位图?

Android:将位图从本地存储加载到应用小部件(RemoteViews)