Android:替代GIF加载程序?

时间:2011-10-26 15:02:33

标签: android gif bitmapfactory

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

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

然后我偶然发现了Android issue 3072 ...结果发现这已被识别为GIF文件损坏了两年多。我意识到GIF并不完全是现代的,但它仍然存在并广泛使用(我的测试集中有很多,这就是为什么它在我发现bug报告之前似乎已经统一破解)。

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

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

1 个答案:

答案 0 :(得分:2)

我最终使用了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;
}