我正在开发一个需要将大图像用作地图的项目。图像大约为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
。为什么会崩溃?我认为它应该在“动态”的图像上工作,但我对错误的唯一解释是它试图将孔图像加载到内存中。有没有人知道如何从图像中加载细节,或者为什么这个想法不起作用?
答案 0 :(得分:1)
它崩溃了,因为所有这些95M被吸入内存进行处理。此调用不会忽略流的某些部分 - 它会将整个内容放入内存中,然后尝试操作它。您可以拥有的唯一解决方案是使用某种服务器端代码执行相同类型的操作,或者如果您不想在服务器上执行此操作,则提供大型图像的缩略图。我强烈建议不要随时拉动整个95M
答案 1 :(得分:0)
BitmapRegionDecoder没有帮助(我意识到它的等级10)?