首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用相同图像资源的BitmapFactory.decodeStream和BitmapFactory.decodeFile行为

使用相同图像资源的BitmapFactory.decodeStream和BitmapFactory.decodeFile行为
EN

Stack Overflow用户
提问于 2014-06-25 15:21:02
回答 1查看 812关注 0票数 2

我有一个奇怪的行为,用BitmapFactory.decodeStream(参考资料,int id)和BitmapFactory.decodeFile(String pathName)方法获取位图。我想设置一个位图到我的小工具remoteViews,它是一个319x319px和32kb的png图像,据我所知,这是一个非常小的图像,应该很容易处理。

现在,发生的情况是,如果我把这个图像放在我的drawables文件夹中,并想用BitmapFactory.decodeResource加载位图,应用程序崩溃,我得到一条错误消息,指出remoteViews超过了最大位图内存使用量。我发现,以下规则(来自developer.google.com)存在最大内存使用量:

代码语言:javascript
复制
 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,但我什么也找不到。

编辑

现在,我用上面的公式计算位图内存使用量,并像这样检查位图大小,从而修复了这个问题:

代码语言:javascript
复制
          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;

然后我知道我的位图的最大大小,并可以对其进行下采样或调整大小。但这并不能解释这种奇怪的行为。

EN

回答 1

Stack Overflow用户

发布于 2014-09-29 04:31:43

如果BitmapFactory是从drawables加载的,那么它还会根据设备屏幕进行一些缩放。通过从文件加载,这将不会发生。如果你把你的图片放在assets文件夹中,也不会发生这种情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24402519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档