为何使用倍图@2x@3x:逻辑像素、设备像素、PPI、DPR的关系

588 阅读3分钟

1.逻辑像素与设备像素的关系

设备像素好理解,例如一台iPhone的参数,分辨率是2532px * 1170px,也就是它的屏幕上每行有1170个像素,每列有2532个像素。

逻辑像素则可以被理解为屏幕上固定大小的一块区域,这个区域里放着像素。 可以理解,同样大小的区域,放的像素越多,像素密度(PPI)也就越大。实际上,逻辑像素和设备像素是有数量关系的,1逻辑像素=1或2^2或3^2设备像素,这种关系就用DPR表示。 我们可以看到,几乎同样大小的iPhone 12 pro和iPhone SE,它们的逻辑像素应该相差不大,但由于屏幕密度的差别,使得iPhone 12 pro的分辨率要比iPhone SE大不少。

iPhone 12 proiPhone SE
屏幕6.1英寸4.7英寸
分辨率2532px * 1170px1334px * 750px
屏幕密度460ppi326ppi

2.逻辑像素与图片尺寸的关系

我们所看到的图片参数的px,其实是逻辑像素。

下面我们来验证一下: 我在html中放入了一张257px * 257px的图片,先来预测一下它在iPhone 12 pro中的展示效果。是这样吗?

未命名文件 (8).png

实际上会是这样的:它占据了屏幕近2/3。 1653624347(1).png

同时,上图的调试工具也告诉了我们,iPhone 12 pro的逻辑像素是390 × 844,那么结合其分辨率,得到DPR为3(390 * 3=1179,844 * 3=2532)。

因此,图片的像素对应着设备的逻辑像素。

3.前端开发处理

上述稍稍令人迷惑的结果,使得我们在开发中注意些什么?

当图片的一个逻辑像素放到设备中的逻辑像素,并被拆成多个设备像素时,会发生什么?————设备像素不能够很好地取色,导致图片在高像素密度的设备中反而更模糊了。

那怎么帮助设备像素获取我们想要的颜色呢?————倍图。其实@2x图就是把图片的一个逻辑像素在图片处理软件上切分成了4个尺寸更小的逻辑像素,使之与设备像素直接1对1地匹配起来。也就是图片的尺寸不变,只是变得更细腻了。

最后,为不同DPR的设备匹配不同的图片,我们可能需要这样操作:

<img srcset="elva-fairy-320w.jpg,
             elva-fairy-480w.jpg 1.5x,
             elva-fairy-640w.jpg 2x"
     src="elva-fairy-640w.jpg" alt="Elva dressed as a fairy">

或者

.img{
    background-image: image-set( "foo.png" 1x, "foo-2x.png" 2x);
}

或者

@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
    /* High density stuff here */
}

参考资料

# 关于Retina

# 如何秒懂 - 物理像素、CSS 像素、CSS 参考像素、设备独立像素?

# 深入浅出逻辑像素和物理像素理解

#【CSS】872- 浅析rem布局方案

# 响应式图片

# Responsive Images 101, Part 8: CSS Images