You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中drawable目录图片加载后尺寸变大的原因排查

问题原因

Android系统会根据设备屏幕密度自动缩放drawable目录中的资源,BitmapFactory.decodeResource()方法默认会应用这个缩放规则。你用inJustDecodeBounds=true获取的是图片原始像素尺寸,但实际加载Bitmap时,系统会根据设备密度对图片进行缩放,导致最终尺寸和原始尺寸不一致。

从你的日志数据来看,加载后的尺寸是原始尺寸的2.75倍,说明当前测试设备的密度系数为2.75(比如550dpi级别的设备),系统自动对图片做了等比例放大处理。

解决方案

有三种常用方法可以解决这个问题:

方法1:将图片放入drawable-nodpi目录

drawable-nodpi目录下的资源不会被系统自动缩放,无论设备密度如何,加载出来的Bitmap尺寸都是图片的原始像素尺寸。只需把你的main_screen图片从原来的drawable目录移动到drawable-nodpi目录即可。

方法2:在BitmapFactory.Options中禁用缩放

修改loadBitmapFromDrawable方法,在options中设置inScaled=false,强制禁止系统对资源进行缩放:

private fun loadBitmapFromDrawable(drawableId: Int): Bitmap {
    val options = BitmapFactory.Options().apply {
        inJustDecodeBounds = true
    }
    BitmapFactory.decodeResource(
        ApplicationProvider.getApplicationContext<Context>().resources,
        drawableId,
        options
    )

    Log.i(
        "ImageComparison",
        "Original bitmap dimensions: ${options.outWidth} x ${options.outHeight}"
    )

    options.apply {
        inJustDecodeBounds = false
        // 禁用系统自动缩放
        inScaled = false
    }
    val bitmap = BitmapFactory.decodeResource(
        ApplicationProvider.getApplicationContext<Context>().resources,
        drawableId,
        options
    )

    Log.i("ImageComparison", "Loaded bitmap dimensions: ${bitmap.width} x ${bitmap.height}")

    return bitmap
}

方法3:匹配资源目录与设备密度

如果你的自动化测试固定在某一密度的设备上运行,可以将图片放入对应密度的drawable目录。比如测试设备是xxhdpi(密度系数3.0),就把图片放在drawable-xxhdpi目录,这样加载时的缩放比例会和设备密度匹配,尺寸保持一致。但这种方法仅适用于固定设备的测试场景。

验证效果

修改后重新运行测试,加载的Bitmap尺寸应该和你日志中记录的1080 x 2220一致,这样就能和自动化测试生成的截图正常对比了。

内容的提问来源于stack exchange,提问作者Artur Iskandarov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:08:09