从网址中加载高大的图像,防止整个图像加载到ram中

时间:2013-06-03 02:06:01

标签: android bitmap streaming android-image

我正在寻找一个库或一些想法,我可以将磁盘上的部件或磁带直接加载到磁盘,然后再将部分加载到磁盘上。所以我看到可以做到的两种方式是将整个图像加载到磁盘上,直接使用ram从url读取和写入缓冲区,然后当磁盘上的图像时,如何创建仅部分的位图对于图像,这样我就不会加载它并将它们放在ListView中。

问题在于我处理的是非常长的图像(10K +像素长,宽度为4-600),如果在一个位图中加载,它们会占用大量的ram。我不能像谷歌android教程在处理大型位图部分那样缩小它们,因为这会导致宽度太小而无法处理。因此,如果我能以某种方式在磁盘上生成小的位图条,我可以通过将它们加载到ListView中来防止将图像作为一个整体加载到ram中来使用它们。

现在我正在将长图像从位图中分解成条子,我意识到这并没有真正完成我想要做的事情,因为整个图像被加载到内存中的位图然后被分解,然后GC(所以我正在使用ram的完全卸载)。我正在测试一个新的顶级Android手机和应用程序工作正常,但堆大小达到80mb +与较大的图像暂时在RAM中,因为它打破了位图,这将是具有较低堆限制的设备的问题

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

如果您使用的是Java,则可以使用 InputStreamReader OutputStreamWriter 。方法 read ()接受缓冲区作为参数之一,其长度可以是任何合适的。当然,您可以为每个正在写入的缓冲区创建一个新文件。

这是你要找的吗?

修改 好吧不是。你见过这个Strange out of memory issue while loading an image to a Bitmap object吗?

答案 2 :(得分:0)

  1. 如果您可以控制从中获取数据的服务器,请在响应中输入另一个字段,以便返回缩略图/较小的图像。然后,服务器可以为您生成所需的缩略图,而无需您为此烦恼。

  2. 在大多数情况下,动态解码位图可能很昂贵。如果您无法更改服务器上的任何内容,下载并保存图片,保存后,生成相应的缩略图并保存。在列表中,使用缩略图。此外,保存有关已缓存的图像以及已有缩略图的信息。这看起来可能很多,但根据用例,这可能是处理大图像的更好方法。

  3. 缩小规模的问题? 好吧,你可以根据图像的原始大小提出某种逻辑来生成缩略图。对于更长(垂直长图像),您可以使用 BitmpapRegionDecoder http://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html)作为@Binh Tran的建议。

答案 3 :(得分:0)

尝试编码图像以缩小尺寸。