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

