8

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

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

现在我正在将长图像从位图中分解成碎片,我意识到这并没有真正完成我想要做的事情,因为整个图像被加载到内存中的位图中然后被分解,然后是 GC(所以无论如何,我正在用完全部的内存)。我正在新的顶级 android 手机上进行测试,该应用程序运行良好,但堆大小达到 80mb+,较大的图像暂时在 ram 中,因为它破坏了位图,这将是具有较低堆限制的设备的问题

4

4 回答 4

2

你可以尝试使用这个类,支持来自 2.3 http://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

于 2013-06-09T11:21:36.640 回答
1

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

是你要找的吗?

编辑 好它不是。在将图像加载到位图对象时,您是否看到过这个奇怪的内存不足问题?

于 2013-06-03T02:18:09.063 回答
0
  1. 如果您可以控制从中获取数据的服务器,请在响应中添加另一个字段,以便它返回缩略图/较小的图像。然后,服务器可以为您生成所需的缩略图,而您无需为此烦恼。

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

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

于 2013-06-11T07:04:31.007 回答
0

尝试对图像进行编码以使尺寸变小。

于 2013-06-12T01:43:19.013 回答