2012-11-07 61 views
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。为什么会崩溃?我认为,流应该在图像上“即时”工作,但我对错误的唯一解释是它试图将空洞图像加载到内存中。有人知道我如何从图像中加载细节,或者为什么这个想法不起作用?

回答

0

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

+0

感谢产生的背景产生错觉较小的图像(S),这就是我正在寻找。这很有趣,它无处提到,即使在officel参考有一个关于大图片网站,但它只是解释了如何使用inSampleSize,和那里有没有一个字关于“BitmapRegionDecoder”。但是,当我使用它时,它仍然崩溃。我偶然被发现,当时我只是给解码器中的BitmapFactory.Options与采样大小1,而不是仅仅称之为“decodeRegion”与“(矩形,空)”(这是不允许的!),问题就解决了,我不不知道为什么,但它的工作:-)。我想我会使用瓷砖和RegionDecoder的组合 –

1

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

+1

或者与基于区块的解决方案去了,像一些游戏应用程序做,那里的大图片的包装不是作为一个单一的整体的整体,而是一个系列的瓷砖,而你只是在你想要的瓷砖加载。 – CommonsWare

+0

您也可以overimpose上的一个大的图像 – Bostone