Android中使用Bitmap时出现图像尺寸不正确的问题

12

我在我的Android应用程序中将.png图像文件作为资源进行存储。 在我的代码中,我按照以下方式从该图像分配新的Bitmap实例:

Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.imgName);

但是当我使用getWight()和getHeight()方法从Bitmap对象中读取图像的尺寸时,

int width = img.getWidth();
int height = img.getHeight();

我从原始图像中获取到了不同的结果... 有人能解释一下我漏了什么,以及如何检索图像大小吗?

(我的项目编译使用的是Android 2.2 - API 8)

编辑: 好的 - 发现如何获取真实尺寸: 将BitmapFactory.Options类的inJustDecodeBounds属性设置为true,如下所示:

BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(getResources(), R.drawable.imgName, options);
    width = options.outWidth;
    height = options.outHeight;

现在的问题是,当我们发送 Options 参数时,解码器返回 null,因此我需要像之前一样再次进行解码(不带 Options 参数...)以获取 Bitmap 实例-很奇怪,不是吗?

2个回答

13

要获取精确的资源图像,请使用:

    BitmapFactory.Options o = new Options();
    o.inScaled = false;
    Bitmap watermark = BitmapFactory.decodeResource(context.getResources(), id, o);

这将关闭自动屏幕密度缩放。

更新: 我相信你现在已经意识到了,在JustDecodeBounds中只是查找图像的尺寸,而不会获得实际的图像。该选项通常用于进行自定义缩放。最终您需要调用decodeResource两次,并在第二次设置:

options.inJustDecodeBounds = false;

根据您的情况进行任何选项调整:

width = options.outWidth;
height = options.outHeight;

可能不是原帖作者想要的,但它确实帮了我很多,谢谢。 - r41n

4

Android会为不同密度的设备(即不同屏幕分辨率和尺寸)缩放您的图像。请在drawable-ldpi、drawable-hdpi、drawable-xhdpi和drawable文件夹中放置图像的单独副本。


谢谢您的回答,但是您知道是否有一种方法可以获取“真实”的图像尺寸吗? - ET.
@ET 最简单的方法是硬编码。无论如何,您都将知道已放置在drawable文件夹中的图像的大小。坦率地说,我还没有尝试获取真实大小。 - manjusg
1
我不能使用这些解决方案,因为图片非常动态,而且它们可能在未来从 Web 服务中检索。此外 - 我有很多图片 :) - ET.
我也想这么做。无法检索位图的源值是一个严重的缺陷。考虑到当加载位图时,Android可以访问这些信息,将这些值公开在位图类中将是一个简单的补充。 - Tickled Pink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接