gpt4 book ai didi

android - 具有相同图像资源的 BitmapFactory.decodeStream 和 BitmapFactory.decodeFile 行为

转载 作者:行者123 更新时间:2023-11-29 00:18:56 26 4
gpt4 key购买 nike

通过使用方法 BitmapFactory.decodeStream(Resources res,int id) 和 BitmapFactory.decodeFile(String pathName) 获取位图,我有一个奇怪的行为。我想为我的 appwidget remoteViews 设置一个位图,它是一个 319x319px 和 32kb 的 png 图像,据我所知,它是一个非常小的图像,应该很容易处理。

现在,令人高兴的是,如果我将此图像放入我的可绘制对象文件夹中并想使用 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 卡文件夹中没有其他图像,我必须设置一些默认图像。为此,我将它们放入我的可绘制文件夹中。如果我将它们缩小到 119x119 像素,那么它就可以工作并且我没有收到任何错误消息。但这是非常糟糕的质量,并且在小部件上看起来完全模糊。

谁能解释一下,加载位图的行为到底有什么区别? 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;

然后我知道我的位图的最大尺寸并且可以缩减采样或调整它的大小。但这并没有回答奇怪的行为。

最佳答案

如果 BitmapFactory 是从可绘制对象加载的,那么它也会根据设备屏幕进行一些缩放。通过从不会发生的文件加载。如果您将图像放在 Assets 文件夹中,它也不会发生。

关于android - 具有相同图像资源的 BitmapFactory.decodeStream 和 BitmapFactory.decodeFile 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24402519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com