- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通过使用方法 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/
这是我的代码...我在 imageBitmap = BitmapFactory.decodeStream(is2,null, options); 处收到异常 NULL; 第一次可以解码,但为什么现在,
我应该从互联网获取图像并将其显示在我的 Activity 中。为此,我使用 asynctask 类。我忘记在我的 list 文件中提及互联网权限,并且应用程序成功运行,没有给出任何异常,并且能够获取模
我在这里从 Cursor 获取值: if (mProfileCursor.moveToFirst()) { byte[] blob = mProfileCursor.getBl
我在尝试解码大小为 2448x2448 像素的照片时遇到了一个奇怪的行为。在代码中,我正在计算应该应用 6 的 inSampleSize(基于生成的位图所需的大小),并且当我使用这些选项调用 Bitm
假设我们有一个工作线程,它使用一些连接流调用 BitmapFactory.decodeStream,如下所示: Bitmap bitmap = BitmapFactory.decodeStream(n
我正在尝试将输入流解码为位图,代码非常简单: Bitmap myBitmap = BitmapFactory.decodeStream(myStream); 但输出位图的质量太低(有时,有时质量很好)
我正在尝试领养 bitmap resizing教程 - 唯一的区别是我使用 decodeStream 而不是 decodeResource。这很奇怪,但是没有任何操作的 decodeStream 给了
我知道这个问题出现了很多次,但我找不到任何对我有帮助的解决方案。我正在从网页下载头像并将其保存在内部存储中。 在我的 Activity 中: // check if user
我们需要对从 InputStream 接收到的图像进行下采样。它是从某个 URL 接收到的图像,它可以非常小或非常大。为了将此图像放入内存,我们必须对其进行下采样。首先,我们借助 inJustDeco
我正在尝试从内部存储中保存和检索位图,但每次我尝试加载位图时,BitMapFactory 都会抛出异常: BitmapFactory: Unable to decode stream: java.io
我正在尝试用下一个代码获取一张刚刚用相机拍摄的照片,但我总是遇到同样的错误: skia(446): --- SkImageDecoder::Factory returned null (它不会抛出异
我们使用下面的函数从 URL 下载图像。有时,BitmapFactory.decodeStream 我们会得到 null。由于这个问题,收到的通知没有图像。任何人都可以帮助我们解决该问题.. 这是我的
我在我的应用程序中使用我自己的 Android ViewFlow 示例实现。我正在从网络服务下载加密图像,而不是将它们保存在 SD 卡上。我正在使用 viewflow 即时解密图像并显示它们。但问题是
显然这是一项昂贵/耗时的操作。有什么办法可以改善这个? Bitmap bm = BitmapFactory.decodeStream((InputStream) new URL(
我试图从图像的路径中获取位图图像。但是 BitmapFactory.decodeStream 返回 null 值。 代码: URL url = new URL(path); HttpURLConnec
我看了很多关于解码位图的内存分配问题的相关帖子,但使用官网提供的代码仍然无法找到以下问题的解决方案。 这是我的代码: public static Bitmap decodeSampledBitmapF
在从 BitmapFactory.decodeStream(imagestream) 返回之前,我需要调整/缩小我从图库中选择的图像。当我选择大图像时,它会抛出 OutOfMemory Excepti
我在 AsyncTask 中使用 BitmapFactory.decodeStream() 从 Internet 下载位图。在我的应用程序中,我有一个图像 ListView ,我只想下载用户可以看到的
我有以下异步任务,它应该只从给定的 URL 加载图像。图片确实存在,我可以访问它们 private class FetchVehicleImage extends AsyncTask {
我的代码旨在在按下 UI 按钮时使用来自服务器的图像更新 ImageView。 下面显示的客户端代码是一个 Runnable,在按下按钮时运行。服务器是一个桌面 Java 应用程序,在后台运行 ffm
我是一名优秀的程序员,十分优秀!