【问题标题】:Android: Alternative GIF loader?Android:替代 GIF 加载器?
【发布时间】:2011-10-26 15:02:32
【问题描述】:

我想在 Android 中加载图片,但如果图片太大,我想在加载之前调整其大小。我了解到可以使用 BitmapFactory 来获取图像的大小,然后可以找出适当的缩放因子并使用 BitmapFactory 加载具有所需尺寸的图像(根据我发现的非常有能力的建议 in this related thread)。

所以我尝试了它,但它拒绝工作。我花了最后一个小时挑选代码,试图弄清楚为什么这么简单的操作没有任何效果(缩放因子被完全忽略了!)

然后我偶然发现了Android issue 3072... 事实证明,这已被确定为 GIF 文件损坏了两年多。我意识到 GIF 并不完全是现代的,但它仍然存在并且被广泛使用(我的测试集有很多,这就是为什么在我发现错误报告之前它似乎一直被破坏)。

我的问题是,我可以使用什么来替代 BitmapFactory,当使用缩放因子而不默默忽略它时,它可以正确读取和调整 GIF 文件的大小? 内存限制会阻止直接加载大图像进行进一步处理,因此这需要是一个流式解决方案。

我的另一个问题是,有多少其他人遇到了像这样的旧的、未修复的错误,或者没有意识到,或者更糟的是,依靠 API 来准确执行请求的功能并最终导致内存泄漏和其他奇怪的意外?

【问题讨论】:

  • 我想知道你是否发现了什么。在你发帖 1.5 年后,这个问题仍然没有解决......
  • 我怀疑人们只是围绕它写作。真是太糟糕了....这个错误没有修复,我从那个需要开始。

标签: android gif bitmapfactory


【解决方案1】:

我最终使用了here 发布的解决方案。

options.inSampleSize = 2;
bitmap = BitmapFactory.decodeStream(new URL(url).openStream(),null, options);
Bitmap scaledBitmap = scaleDown(bitmap, 1280, true);
bitmap = scaledBitmap;

scaleDown 在哪里:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
                               boolean filter) {
    float ratio = Math.min(
                (float) maxImageSize / realImage.getWidth(),
                (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
                height, filter);
    return newBitmap;
}

【讨论】:

  • 感谢您的解决方案!很高兴终于在这个问题上得到了某种结论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多