我想在Android中加载图片,但是如果图片太大,我想在加载之前调整大小。我了解到,可以使用BitmapFactory来获取图像的大小,然后可以找出适当的缩放比例,并使用BitmapFactory来加载具有所需尺寸的图像(根据我发现的非常有力的建议in this related thread)。
所以我尝试了一下,但它拒绝了。我花了最后一个小时来检查代码,试图弄清楚为什么这样一个简单的操作没有任何效果(比例因子被完全忽略了!)
然后我偶然发现Android issue 3072 ...事实证明,此文件已被GIF文件破坏了两年多了。我意识到GIF并非完全现代,但仍然存在并且仍在广泛使用(我的测试集有很多,这就是为什么在我找到该错误报告之前,它似乎一直被破坏的原因)。
我的问题是,当使用缩放因子而不默默忽略它时,我可以用作BitmapFactory的替代方案吗?内存限制使得无法直接加载大图像以进行进一步处理,因此这将是一种流解决方案。
我的另一个问题是,有多少其他漏洞遇到了这样的古老的,未修复的错误,或者没有意识到,甚至更糟,它们依靠API来准确地执行所请求的功能,并最终导致内存泄漏和其他奇怪的意外?
最佳答案
我最终使用了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;
}