从URL加载高分辨率的图像,防止整个图像加载到内存中

我正在寻找一个图书馆或一些想法,如何我可以加载一个图像的部分从磁盘或一个url直接到磁盘,然后在部分再次到公羊。 所以我看到这两种方式,我可以做到这一点是加载整个图像到磁盘上读取和写入直接使用ram只从缓冲区,然后当图像在磁盘上的一些如何创build位图的图像,这样我不会加载全部并把它们放在一个ListView

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

现在我打破了从一个位图的长条图片,我意识到,这并不是真的完成了我想要做的事情,因为整个图像加载到内存中的位图,然后分解,然后GC(So无论如何,我正在用尽全部的ram)。 我正在testing一个新的顶级的行手机和应用程序工作正常,但堆大小达到80MB +与临时在内存中的较大的图像,因为它打乱了位图,这将是一个问题,具有较低的堆限制的设备

Solutions Collecting From Web of "从URL加载高分辨率的图像,防止整个图像加载到内存中"

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

这是你在找什么?

编辑好吧不是。 你有没有看到这个奇怪的内存不足的问题,同时加载到一个位图对象的图像 ?

  1. 如果您对从中获取数据的服务器有控制权,请在响应中引入另一个字段,以便返回缩略图/较小的图像。 服务器可以为您生成所需的缩略图,而不用担心。

  2. 在飞行中解码位图可能是昂贵的,大部分时间。 如果您无法更改服务器上的任何内容,请下载并保存图像保存后, 生成相应的缩略图并保存 。 在你的列表中,使用缩略图。 此外,请保存关于哪些图像已被caching的信息,以及您已经拥有哪些缩略图。 这可能看起来像很多工作,但取决于用例,这可能是一个更好的方法处理大型图像。

缩小规模的问题? 那么,你可以想出一些逻辑来生成缩略图,基于图像的原始大小。 对于更长的(垂直长的图像),您可以使用@Binh Tranbuild议的BitmpapRegionDecoderhttp://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html )。

尝试编码图像,以使尺寸变小。