2

我正在做一个需要使用大图像作为地图的项目。该图像约为 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。为什么会崩溃?我认为使用流它应该“即时”处理图像,但我对错误的唯一解释是它试图将孔图像加载到内存中。有谁知道我如何从图像中加载细节,或者为什么这个想法不起作用?

4

2 回答 2

1

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

于 2012-11-07T19:17:16.897 回答
0

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

于 2012-11-08T12:28:18.157 回答