为什么程序读取图片文件后分辨率变小了?

Why do resolutions become smaller after a image file be read by program?

我遇到一个问题:

我有不同大小的图像文件。 (hdpi, xhdpi, xxhdpi, xxxhdpi)

当我在hdpi,xhdpi,xxhdpi设备中使用图像文件时,它很好。

但是当设备是xxxhdpi时,图像文件的分辨率变小了。

我不知道为什么会这样。

例如:

我有2台设备,一台是xxhdpi,一台是xxxhdpi。

我有2个图像文件,一个放在文件夹"drawable-xxhdpi",它的分辨率是1080x1920。另一个放在文件夹"drawable-xxxhdpi"里,它的分辨率是1440x2560.

当我读取图像文件时,出现了问题。

案例xxhdpi: 原图是1080x1920,读取的图片还是1080x1920。

案例xxxhdpi: 原图是1440x2560,读出来的图变成了1260x2240。

这是我的代码:

DisplayMetrics metrics = new DisplayMetrics();
            getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
            Log.i("SettingCardFragment", String.format("%37s%dx%d",
                    "Screen resolution: ", metrics.widthPixels, metrics.heightPixels));

            Drawable drawable = ContextCompat.getDrawable(getActivity(),R.drawable.background);
            Log.i("SettingCardFragment", String.format("%37s%dx%d",
                    "(Drawable)Background.png resolution: ", drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()));

            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background);
            Log.i("SettingCardFragment", String.format("%37s%dx%d",
                    "(Bitmap)Background.png resolution: ", bitmap.getWidth(), bitmap.getHeight()));

我用代码查看读取的图片的分辨率。

我在 xxhdpi 设备中得到了结果:

SettingCardFragment:                   Screen resolution: 1080x1776
SettingCardFragment: (Drawable)Background.png resolution: 1080x1920
SettingCardFragment:   (Bitmap)Background.png resolution: 1080x1920

xxxhdpi设备的结果:

SettingCardFragment:                   Screen resolution: 1440x2392
SettingCardFragment: (Drawable)Background.png resolution: 1260x2240
SettingCardFragment:   (Bitmap)Background.png resolution: 1260x2240

为什么分辨率从 1440x2560 变成了 1260x2240?

哪位知道的请帮帮我~

Bitmap bitmap = BitmapFactory.decodeResource(getResources()

decodeResource 将为您的设备调整分辨率。

如果您想要原始分辨率,请先为资源打开 InputStream,然后使用 BitmapFactory.decodeFromStream()

我想我明白了。您正在使用密度为 3.5 的设备(例如 Nexus 6p)。您可以使用此代码 getResources().getDisplayMetrics().density 检查密度。在这些设备中使用 xxxhdpi 然后缩放。

因此,如果我们进行缩放数学运算 - image_size / xxxhdpi_density * device_density 您将得到您所看到的尺寸:

2560 / 4 * 3.5 = 2240

1440 / 4 * 3.5 = 1260