Android使用 BitmapFactory.Options获取宽高不准确问题

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();
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:BitmapFactory.Options中参数使用
  • 同时,你还可以查看手册:android BitmapFactory.Options 中的内容
  • 除此之外, 这篇博客: BitmapFactory.Options中参数使用中的 不同资源文件目录中图片的大小 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在Android中计算Bitmap所占内存的大小时,可以使用下面的公式:

    一张bitmap所占用的内存大小=宽度px高度px一个像素所占用的字节数

    在确定图片宽度和高度的时候,不能仅仅简单的右键图片的属性查看宽度和高度的值,因为android中会根据屏幕分辨率匹配对应的资源文件目录,图片的大小会进行相应的缩放,android中不同的屏幕分辨率对应的density如下:
    在这里插入图片描述
    官方文档:支持不同的像素密度

    • densityDpi:屏幕密度,及Dpi(dots-per-inch)每英寸的像素数。
    • density:像素密度,表示dp(divices independent pixels)与px的换算比例 px= density*dp(dp为代码中设置的数值),其中density=dpi/160。

    因此将相同的照片放到不同的资源目录中,因为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下面的图片文件。