为什么在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/
。