从资源加载后位图宽度/高度不同

Posted

技术标签:

【中文标题】从资源加载后位图宽度/高度不同【英文标题】:Bitmap width/height different after loading from Resource 【发布时间】:2011-07-04 22:22:31 【问题描述】:

第一。我是 android 编码的新手 :)

我所做的是从我的 res/drawable-mdpi 加载位图

BitmapFactory.decodeResource(getResources(), R.drawable.cat_ground_01);

在我注销位图的宽度/高度后,它会告诉我另一个值,然后位图实际上是。

这有点难以放置像素完美的位图,例如将面部位图与嘴部位图重叠。

也许我只是缺少有关此主题的一些知识:9 我希望你能帮忙。

【问题讨论】:

【参考方案1】:

你不能把资源放在nodpi文件夹里吗?

即res/drawable-nodpi

这是我过去所做的。

【讨论】:

【参考方案2】:

在我注销位图的宽度/高度后,它会告诉我另一个值,然后位图实际上是。

从 /drawable 加载位图后检查您的 options.inTargetDensity 和 options.inDensity。它们不相等(例如 160 和 240)。如果 options.inScaled 设置为 true(默认) - 这就是位图自动重新缩放的原因。

另一种方法是使用 Bitmap.createScaledBitmap 在加载后重新缩放图像。因为有时你需要 inScaled=true

        //Target dimensions
        int iW = 300;
        int iH = 200;
        Bitmap mOriginalBitmap = new Bitmap;
        BitmapFactory.Options options = new BitmapFactory.Options();
        //Load image from resource
        mOriginalBitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.sample_image_900px, options);
        //Scale to target size
        mOriginalBitmap = Bitmap.createScaledBitmap(mOriginalBitmap, iW, iH, true); 

【讨论】:

这会带来额外的性能问题。当确实需要 inScaled 时,这是一种解决方法。【参考方案3】:

当您执行 Bitmapfactory.decodeResource() 时,Android 默认会选择“匹配”的 dpi 版本进行解码,您提到的代码中发生的情况将产生:

    您无法指定它是 mdpi、hdpi 还是其他格式,它将选择与您正在运行的系统匹配的版本。即,如果您在 mdpi 设备上运行,它将解码 mdpi 版本;在 ldpi 中,然后是 ldpi 版本。

    1234563大约 1.5 倍大);同样,如果您的设备分辨率较低,那么它会缩小图像

我想这就是发生在你身上的事情。对于 BitmapFactory,它实际上可以选择不缩放图像:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

将 inScaled 设置为 false 即可。

【讨论】:

非常感谢。我认为类似的事情正在发生,但我确定。

以上是关于从资源加载后位图宽度/高度不同的主要内容,如果未能解决你的问题,请参考以下文章

尝试从资源加载位图返回 NULL,错误代码为 1813

iOS获取WKWebView的高度

UIProgressView 在我的应用程序加载其资源时没有更新

从 VB6 访问 C++ DLL 中的位图资源

CEGUIFont资源加载流程

CEGUIFont资源加载流程