我的工作需要使用一个大的图像作为地图项目的细节。该图像大约为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
。为什么会崩溃?我认为,流应该在图像上“即时”工作,但我对错误的唯一解释是它试图将空洞图像加载到内存中。有人知道我如何从图像中加载细节,或者为什么这个想法不起作用?
感谢产生的背景产生错觉较小的图像(S),这就是我正在寻找。这很有趣,它无处提到,即使在officel参考有一个关于大图片网站,但它只是解释了如何使用inSampleSize,和那里有没有一个字关于“BitmapRegionDecoder”。但是,当我使用它时,它仍然崩溃。我偶然被发现,当时我只是给解码器中的BitmapFactory.Options与采样大小1,而不是仅仅称之为“decodeRegion”与“(矩形,空)”(这是不允许的!),问题就解决了,我不不知道为什么,但它的工作:-)。我想我会使用瓷砖和RegionDecoder的组合 –