【问题标题】:Android: load only detail of large imageAndroid:仅加载大图像的细节
【发布时间】:2012-11-07 18:48:57
【问题描述】:

我正在做一个需要使用大图像作为地图的项目。该图像约为 95MB,分辨率为 12100 x 8000 像素。

我不需要一次完整的图像,我只需要一个 1000 x 1000 像素的细节(它并不总是相同的细节,只抓取相同的部分不是我可以使用的解决方案)。所以我不能只用BitmapOptions 对其进行采样。

我环顾四周,发现了创建FileInputStream 的想法(图像在 SD 卡上),然后我可以使用decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts) 加载详细信息。这样我就不会将整个内容加载到内存中。我试过了,但是当我尝试加载图像时它只是崩溃了。这是我的代码:

FileInputStream stream = null;
try {
    stream = new FileInputStream(path);
} catch(Exception e) {
    Log.e("inputstream",e.toString());
}
Rect rect = new Rect(a,b,c,d);
return BitmapFactory.decodeStream(stream, rect, null);    

当我尝试加载图像时,活动关闭,LogCat 告诉我java.lang.outOfMemoryError。为什么会崩溃?我认为使用流它应该“即时”处理图像,但我对错误的唯一解释是它试图将孔图像加载到内存中。有谁知道我如何从图像中加载细节,或者为什么这个想法不起作用?

【问题讨论】:

    标签: android out-of-memory large-files imagemap


    【解决方案1】:

    它崩溃了,因为所有这些 95M 都被吸入内存进行处理。此调用不会忽略流的某些部分 - 它会将整个内容放入内存,然后尝试对其进行操作。您可以拥有的唯一解决方案是拥有某种执行相同操作的服务器端代码,或者如果您不想在服务器上执行此操作 - 提供大图像的缩略图。而且我强烈建议不要在任何时候拉整个 95M

    【讨论】:

    • 或者使用基于图块的解决方案,就像一些游戏应用程序一样,其中大图像不是作为一个整体打包,而是作为一系列图块,您只需加载你想要的瓷砖。
    • 您也可以在生成的背景上叠加较小的图像,从而产生一张大图像的错觉
    【解决方案2】:

    BitmapRegionDecoder 没有帮助吗(我意识到它的级别 10)?

    【讨论】:

    • 谢谢,这就是我正在寻找的。有趣的是它没有被提及,即使在 officel 参考中也有一个关于大图像的网站,但它只是解释如何使用 inSampleSize,并没有关于“BitmapRegionDecoder”的字样。但是,当我使用它时,它仍然崩溃。我偶然发现,当我只是给解码器一个带有 SampleSize 1 的 BitmapFactory.Options 时,而不是只用 '(rect, null)' 调用 'decodeRegion' (这是允许的!),问题就解决了,我不'不知道为什么,但它的工作原理:-)。我想我会使用瓦片和 RegionDecoder 的组合
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2017-12-10
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多