如何在Android中从大位图中加载瓦片?

8
如果我有一个大的位图文件,通常会生成“内存不足”异常,如何将其作为瓦片加载?例如,我有一张10,000x10,000像素的图片,我想将它分成一个10x10的网格,每个网格大小为1,000x1,000像素。
我看到了函数Bitmap.createBitmap(sourceBitmap, x, y, width, height),但它需要我的大图像作为源输入。
如何从我的输入图像中获取瓦片,而无需完全加载输入图像?

为什么不能将一个巨大的图像分成16个不同的图像? - Nick Banks
因为我只是从用户手机中加载一张图片。 - Mark Ingram
3个回答

19

0

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

最好在将图像放入手机之前将其分成瓷砖。

如果这两个选项都不适合您,我认为您就没有什么办法了。


嗨,谢谢你的回复,不幸的是,我对应用程序中使用的图片没有任何控制权。 - Mark Ingram

0

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

从字里行间可以看出,如果“isShareable”为true,则先前提到的BitmapRegionDecoder()会在后台执行此操作。否则,它似乎会解压缩图像并存储未压缩的副本。对于每个像素1字节,将需要100MB来保存您的10,000x10,000位图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接