为啥程序读取图像文件后分辨率会变小?

Posted

技术标签:

【中文标题】为啥程序读取图像文件后分辨率会变小?【英文标题】:Why do resolutions become smaller after a image file be read by program?为什么程序读取图像文件后分辨率会变小? 【发布时间】:2017-10-09 04:52:21 【问题描述】:

我遇到了一个问题:

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

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

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

我不知道为什么会这样。

例如:

我有两台设备,一台的分辨率是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?

如果谁知道,请帮帮我~

【问题讨论】:

你好,我猜图片的宽度和高度都匹配,对吧? 您确定它是 xxxhdpi 设备并且您没有看到 xxhdpi 的放大版本吗? @X09 为什么图片大小和屏幕匹配?我只是将它读入程序,我没有将它应用到任何视图中。 @Jim,是的,对不起,你是对的。似乎有点奇怪。但是您确定图像的分辨率对吗? @X09 是的,我确定图片的分辨率是 1440x2560,无论是从 Windows 还是从 android Studio 的窗口。 【参考方案1】:

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

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

2560 / 4 * 3.5 = 2240

1440 / 4 * 3.5 = 1260

【讨论】:

是的,你解决了我的问题,并且告诉我尺寸是如何变化的。非常感谢!【参考方案2】:
Bitmap bitmap = BitmapFactory.decodeResource(getResources()

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

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

【讨论】:

以上是关于为啥程序读取图像文件后分辨率会变小?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序 - 为啥同时包含 @2x 和低分辨率图像?

怎么设置图片的KB变大

django导出excel文件的内容为啥是空的

为啥我执行 PCA 后图像文件的大小会增加?

视图中的drupal图像全屏显示,如何使图像变小?

jQuery 上传会以一定的分辨率调整图像大小