我有一个奇怪的行为,用BitmapFactory.decodeStream(参考资料,int id)和BitmapFactory.decodeFile(String pathName)方法获取位图。我想设置一个位图到我的小工具remoteViews,它是一个319x319px和32kb的png图像,据我所知,这是一个非常小的图像,应该很容易处理。
现在,发生的情况是,如果我把这个图像放在我的drawables文件夹中,并想用BitmapFactory.decodeResource加载位图,应用程序崩溃,我得到一条错误消息,指出remoteViews超过了最大位图内存使用量。我发现,以下规则(来自developer.google.com)存在最大内存使用量:
The total Bitmap memory used by the RemoteViews object cannot exceed that
required to fill the screen 1.5 times, ie.
(screen width x screen height x 4 x 1.5) bytes.现在到奇怪的部分:如果我从SD卡加载相同的图像,并使用BitmapFactory.decodeFile()解码它,它可以工作。为什么会发生这种情况?
我在这里面临的问题是,如果我的SD卡文件夹中没有其他图像,我必须设置一些默认图像。为此,我将它们放到了我的drawables文件夹中。如果我将它们缩小到119x119px,那么它可以工作,并且我没有得到错误消息。但这是非常糟糕的质量,并且在小部件上看起来完全模糊。
谁能解释一下,加载位图的行为到底有什么不同?decodeFile()中有没有decodeResource()中没有的自动缩放函数?
代码的一部分或者logcat的输出是无关紧要的,所以我不在这里发表它,我只是不能理解这种行为,也不知道如何处理它。此外,我对此进行了大量搜索,并阅读了API,但我什么也找不到。
编辑
现在,我用上面的公式计算位图内存使用量,并像这样检查位图大小,从而修复了这个问题:
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
double width = (double) metrics.widthPixels;
double height = (double) metrics.heightPixels;
double maximumUsage = width * height * 4.0 * 1.5;
double maximumImageSizeFaktor = (maximumUsage / 3) / 1.5 / 4;
double maximumImageSize = Math.sqrt(maximumImageSizeFaktor);
int maxSize = (int) maximumImageSize - 10; //just to get sure, minimize it for 10
return maxSize;然后我知道我的位图的最大大小,并可以对其进行下采样或调整大小。但这并不能解释这种奇怪的行为。
发布于 2014-09-29 04:31:43
如果BitmapFactory是从drawables加载的,那么它还会根据设备屏幕进行一些缩放。通过从文件加载,这将不会发生。如果你把你的图片放在assets文件夹中,也不会发生这种情况。
https://stackoverflow.com/questions/24402519
复制相似问题