【问题标题】:Loading tall images from url in slivers preventing whole image from loading into ram从 url 加载高大的图像,防止整个图像加载到 ram
【发布时间】:2013-06-03 02:06:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: android bitmap streaming android-image


    【解决方案1】:

    【讨论】:

    • 这是否需要我将图像加载到内存中的位图中?这就是我要避免的。谢谢。
    【解决方案2】:

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

    这是你要找的吗?

    编辑 好吧,它不是。你看过这个Strange out of memory issue while loading an image to a Bitmap object 吗?

    【讨论】:

    • 我如何知道我在每个部分中有多少图像,我需要有图像宽度和任何高度的条子,以便我可以在列表视图中设置它们
    • 对不起,我有点忙,但我无法为您的代码找到可比较的 android 版本。让我们说 png。
    • 我刚刚查看了您指出的问题,但它没有帮助,因为使用缩小尺寸方法会降低高度和宽度,并且在长图像上这样做会导致宽度非常小。通过长图像,我说的是 10k+ 像素。
    【解决方案3】:
    1. 如果您可以控制从中获取数据的服务器,请在响应中添加另一个字段,以便它返回缩略图/较小的图像。然后,服务器可以为您生成所需的缩略图,而您无需为此烦恼。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多