为啥程序读取图像文件后分辨率会变小?
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()
。
【讨论】:
以上是关于为啥程序读取图像文件后分辨率会变小?的主要内容,如果未能解决你的问题,请参考以下文章