【问题标题】:How to load tiles from a large bitmap in Android?如何从 Android 中的大位图加载图块?
【发布时间】:2024-04-25 14:40:02
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不能将一张巨大的图片分成 16 个不同的图片?
  • 因为我只是从用户的手机加载图像。

标签: java android memory-management bitmap


【解决方案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。

    【讨论】:

      最近更新 更多