为什么在Android中加载jpg资源时图像的大小会发生变化?

我创建了一个新的Android项目,并在res/drawable文件夹中放置了一个map.jpg文件。 它的统计是这样的,由file命令报告:

 map.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 200x200, segment length 16, baseline, precision 8, 1000x846, frames 3 

(尺寸1000×846。)

该项目使用min SDK版本21和目标SDK版本24。

我在我的类(这是一个View子类)像这样(Kotlin)打开文件:

 mBitmap = BitmapFactory.decodeResource(resources, R.drawable.map) Log.i(TAG, "Our map's size is " + mBitmap.width + "x" + mBitmap.height) 

在仿真器(480×800 hdpi,API级别25)中运行时,会将位图大小报告为1500×1269,或者从文件大小中缩放1.5x。

在设备上运行(三星Galaxy A3,API级别24)报告的大小为2000×1692,或缩放2倍。

为什么会发生? 什么是加载的位图的大小取决于?

(顺便说一句,通过resources.getDrawable()Drawable.getIntrinsicWidth()读取资源的另一种方式报告相同的大小。)

我创建了一个新的Android项目,并在res / drawable文件夹中放置了一个map.jpg文件

这不太可能是一个很好的选择目录。

在仿真器(480×800 hdpi,API级别25)中运行时,会将位图大小报告为1500×1269,或者从文件大小中缩放1.5x。

在设备上运行(三星Galaxy A3,API级别24)报告的大小为2000×1692,或缩放2倍。

为什么会发生?

因为你把图像放在res/drawable/ 。 这是res/drawable-mdpi/的同义词。 你在说这个图片是为mdpi屏幕设计的(大约160dpi)。 如果在更相关的对等目录(例如res/drawable-hdpi/ )中没有此资源的其他变体,则Android将缩放资源以适应所在屏幕的密度。 您的模拟器是一个hdpi配置; 你的Galaxy A3是一个xhdpi设备。

如果你想说这个图像不应该根据密度进行缩放,把它放在res/drawable-nodpi/res/drawable-anydpi/