原文链接:https://tingxuanr.github.io/note/图片在显示器上在为什么会糊ppidpiretina/#more
摘要:有关图片的缩放及Retina屏幕介绍
图片缩放
图片是由一个个的像素点组成,屏幕也是一个个的像素点组成,如果屏幕的像素点和图片的像素点能够一一对应,那么图片就能够正常显示。
比方说有一个27英寸1920x1080的屏幕,图片分辨率为900x600,图片以点对点的形式显示在屏幕中央;如果换成一个27英寸2560x1440的屏幕,那么每个像素点的面积就变小了,如果还以点对点的形式显示,图片也会变小,此时就需要通过缩放来显示图片。
缩放计算方式:
在 1080P 屏幕上,显示比例为:水平方向:900 / 1920 ≈ 46.9%;垂直方向:600 / 1080 ≈ 55.6%
在 1440P 屏幕上,要保持相同的显示比例,图片大小为:水平方向:2560 × 46.9% ≈ 1200 像素;垂直方向:1440 × 55.6% ≈ 800 像素。
也就是从900x600放大到1200x800的尺寸。
一般系统采用的是双线性插值算法来进行拉伸填充,这样就会使得图片变得模糊。如果把屏幕换成3840x2160,就可以用屏幕的四个像素点替代图片的一个像素点,这就是临近像素采样算法。
插值算法
正是插值算法,使得图片失真。
双线性插值基于周围四个像素点的加权平均,提供了更平滑的结果,但是会导致图片模糊。而临近像素采样直接复制最近的原始像素值,图像不会模糊但是边缘可能有明显锯齿。如假设下面2x2像素的图片要放大到4x4像素(实际的值并不准确,只是示意):
原始 | 临近像素采样 | 双线性插值 | |
---|---|---|---|
1 3 5 7 |
1 1 3 3 1 1 3 3 5 5 7 7 5 5 7 7 |
1.00 2.00 3.00 3.00 3.00 4.00 5.00 5.00 5.00 6.00 7.00 7.00 5.00 6.00 7.00 7.00 |
Windows的DPI导致软件图片及字体模糊
在最早期的时候,屏幕的PPI和打印用的DPI是一致的。一个图片在屏幕上有72个像素,打印机打印出来也是72个点。但是后来电脑屏幕比纸张要大不少,而且人与屏幕的距离也比人与纸张的距离要远,所以同样的像素点在大屏幕上显得就小了。于是Windows就把图片进行放大,一个72x72像素的图片,Windows会放大成96x96。
经过不断的发展,Windows有了现在的几个默认放大倍数:100%、125%、150%、175%、200%,分别对应96DPI、120DPI、144DPI、168DPI、192DPI。大部分应用都默认使用的96DPI,屏幕PPI与系统DPI的比值就是应用UI的放大倍率,所以当屏幕的PPI与系统的DPI比值越接近1,应用UI显示就越合适。但是使用非整数倍缩放,会导致因为线性插值算法导致的图片或文字模糊失真。
比方说,屏幕尺寸23.8英寸,分辨率1920x1080,计算得出PPI为
那么放大倍率选择100%就刚好合适。屏幕尺寸27英寸,分辨率3840*2160,计算得出PPI为
, 放大倍率选择175%,此时DPI/PPI=168/163≈1.03,应用UI就和开发者想让你看到的大小差不多,但图片和文本可能因为非整数缩放而模糊;如果选择200%缩放,此时DPI/PPI=192/163≈1.18,界面元素比开发者想让你看到的大18%,虽然图片文字不会模糊,但应用UI会显示的更少。
不过,对于使用而言,UI大小合适应该是优先考虑的,所以缩放比例尽量还是让PPI/DPI接近1更合适。
除了DPI缩放,Windows还有GDI。这种缩放会先以整数倍对矢量文本和图片进行缩放,然后再进行DPI的缩放比。如设置了电脑缩放比例为175%,那么Windows会先以2倍缩放,再进行1.75倍缩放。Windows上的磁盘管理界面、环境变量等界面都还是用的GDI缩放。但是不是所有内容都能进行GDI缩放,开启后可能会让元素错位甚至消失。
PPI多少合适
由于人眼对屏幕清晰度的感知会有极限。在一定距离下,PPI超过某个值后人眼就感受不到屏幕的颗粒感。对于标准的5.0视力,可以在5m距离看清视力表第11行。
苹果的Retina视网膜屏幕定义就是:当设备距离人眼 10-12 英寸(约 25-30 厘米)时,像素密度达到 300 PPI 以上,人眼就无法分辨单个像素点。
Retina计算公式为: a = 2 × arctan(h/2d)。其中a为人眼所见单个像素的视角(以弧度表示),一般为1/60度 = 1/60 x π/180 = π/10800 弧度;h为像素间距,即相邻像素中心之间的距离,单位英寸;d 人眼与屏幕的距离,单位英寸。
可以推出h = 2d × tan(a/2) ;而PPI = 1/h,也就是一英寸距离内像素个数。
按照这个公式,30cm(约为30/2.54 = 11.81英寸)距离下,h = 2 x 11.81 x tan(π/21600) = 0.003435;屏幕PPI = 1 / h = 291.12。
所以iPhone4发布会上把iPhone4的屏幕
\[ppi =\sqrt{(640^2+960^2)/(3.5^2)} ≈ 329 \]定义为Retina屏幕。
同样显示器观看距离为60cm,PPI至少要达到 1 / (2 x 60 / 2.54 x tan (π/21600)) ≈ 146。常见的27英寸4K显示器是能够达到这个要求的。
另外,由于OLED像素点的排列方式,它的ppi是需要打折扣。方便起见可以按80%计算,比方如果宣传的OELD屏幕ppi为300ppi,实际的为300x0.8=240ppi。
参考链接
【硬件科普】换了更高分辨率的显示器,软件界面反而模糊-Windows缩放详解