BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
int height = options.outHeight;
int width = options.outWidth;
通过上述代码获取图片真实宽高,目前有个尺寸4000*2992像素的图 但是获取到的宽高变成1000-748 请问如何获取图片原本的宽高?
额?你图片原始宽高从哪看的?上面那样获取图片原始宽高没问题的。
inJustDecodeBounds为true,outWidth/outHeight表示没有经过Scale的Bitmap的原始宽高(即我们通过图片编辑软件看到的宽高)
如果 inJustDecodeBounds 为 false,为加载到内存后的 Bitmap宽高(这里是经过Scale之后的宽高)。
返回不正确的尺寸是因为你把 inJustDecodeBounds 参数设置为 true 了,设置为 true 后,BitmapFactory.decodeFile()不会返回实际的Bitmap图像,而是解码图像文件以获取图像的宽度和高度信息,所以如果想要获取实际的图像宽度和高度,需要将 inJustDecodeBounds 设置为 false :
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
int height = bitmap.getHeight();
int width = bitmap.getWidth();
在Android中计算Bitmap所占内存的大小时,可以使用下面的公式:
一张bitmap所占用的内存大小=宽度px高度px一个像素所占用的字节数
在确定图片宽度和高度的时候,不能仅仅简单的右键图片的属性查看宽度和高度的值,因为android中会根据屏幕分辨率匹配对应的资源文件目录,图片的大小会进行相应的缩放,android中不同的屏幕分辨率对应的density如下:
官方文档:支持不同的像素密度
因此将相同的照片放到不同的资源目录中,因为dpi的不同,加载不同目录资源时得到的px大小是不同的,但是如果将图片放在非drawable资源目录,而是放在文件存储目录中,是不会进行缩放的。
代码验证:
我们加载一张2500*2500的图片进行验证:
//首先在这里获取dpi
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
//查看日志我这个设备的dpi为480,相应的对映的资源文件为xxhdpi目录
Log.i(TAG, "displayMetrics.densityDpi: " + displayMetrics.densityDpi);
看日志设备的dpi为480为xxhdpi,把图片放到xxhdpi(AS创建不同DPI目录的方法),加载该图片:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kite);
Log.i(TAG, "onCreate: bitmap.getWidth():" + bitmap.getWidth() + " bitmap.getHeight() " + bitmap.getHeight());
查看日志,加载的图片尺寸和原始尺寸一致: onCreate: bitmap.getWidth():2500 bitmap.getHeight() 2500
把图片放到xdpi目录,加载该图片查看日志:
onCreate: bitmap.getWidth():3750 bitmap.getHeight() 3750
日志看到图片进行了放大,xdpi为320,根据dpi进行计算:2500*(480/320)=3750,最终的图片大小为3750,所以,加载不同的dpi目录资源,得到的图片最终px大小是不一样的。
如果没有完全对应的dpi,那么该如何匹配呢?查看官方文档发现下面的描述:
当没有相匹配的dpi,例如当dpi为420时,则匹配的是xxhdpi的资源,这样就避免了xhdpi中的文件被放大而导致的图片模糊。
代码验证:
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
MainActivity_main: displayMetrics.densityDpi: 420设备的dpi为420时,图片位于xxhdpi下,我们得到的图片大小为:
onCreate: bitmap.getWidth():2188 bitmap.getHeight() 2188
根据dpi进行px计算计算:(420/480)*2500=2187.5,可以看到对图片进行了缩小,取的是xxhdpi下面的图片文件。