像素是什么

Author Avatar
Miaoxingren 6月 07, 2017

本文根据 Lukas 的 What’s a Pixel? 翻译,无法保证译文完全正确。

问题

Appway的很多屏幕组件都要求输入像素值。例如,自适应流布局具有这样的属性。

Adaptive Flow Layout

然而,我的手机屏幕是400DPI的,这意味着它每英寸显示400个像素。我的电脑屏幕只有大约100DPI,所以它只显示大约100个像素。这是否意味着相同的值在PC上比在手机上大四倍?“像素”到底是什么意思?

解决方案

这个问题放到十年前是很容易回答的:“像素就是CRT屏幕上发光的小点。”不幸的是,现在不再有这样的屏幕,像素也不再是这种意义;至少不是键入屏幕组件属性的那种像素。

对于这个问题有一个简短答案和一个详细答案。让我们从简短的答案开始。

简短答案

Appway中的一个像素是一个长度单位,在大多数设备上看起来都差不多相同的长度。一般来说,它大约是1/100英寸。它与屏幕上的发光点无关,除非你恰好有一台在屏幕上有非常大圆点的旧电脑。

详细答案

要确切地理解Appway中的一个像素实际上是什么,需要了解计算机渲染Appway屏幕时会发生什么,因为在此过程中,会涉及到不同类型的像素:

  • 逻辑像素
  • 渲染像素
  • 物理像素

逻辑像素

首先,从逻辑像素开始:这是键入组件的属性字段的内容。它实际上并不是一个像素,而是一种粗略的度量,它的长度是“像素曾经的长度,那时只有一种像素,考虑到屏幕离眼睛有多远”。在Appway使用的CSS规范中,它被定义为0.75pt。同时,1pt被定义为1/72英寸。然而,CSS的一英寸并不是真正的一英寸。CSS允许设备把像素作为anchor unit使用,这意味着CSS的英寸是根据设备认为的像素的大小来计算的。那么设备认为的像素的大小应该是多少?这取决于用户会在距离眼睛多远处拿着设备:

参考像素是设备上的一个像素的视觉角度,设备的像素密度为96dpi而且距离读者一个手臂的距离。手臂的长度标定为28英寸,因此视觉角度约为0.0213度。以一个手臂的距离进行浏览,1px相当于约0.26毫米(1/96英寸)。

在电视上(通常离观察者很远),一个逻辑像素可能比一毫米大,而在手机上(更靠近观察者),它可能比四分之一毫米还小。

换句话说,使用的设备类型不同,逻辑像素的物理尺寸也不同。对于用户可能使用的设备来说,逻辑像素的物理尺寸通常在1/100英寸附近浮动。在这个阶段,像素不是区域或点之类的。它们是长度单位,就像一毫米或一英寸 —— 但更小,没有精确定义,而且根据设备不同其大小略有不同。

简而言之,使用(逻辑)像素是以某种程度上独立于设备的方式来指定大小。桌面PC上的400个逻辑像素与智能手机上400个逻辑像素大致相同大小。这就是为什么我们在Appway中使用逻辑像素来指定大小:它们跨设备转换。

渲染像素

当操作系统渲染屏幕时,逻辑像素会被转换为渲染像素。逻辑像素与渲染像素的转换使用设备像素比device-pixel-ratio。这个比率为每个设备指定了多少个逻辑象素转化为多少个渲染像素。比率不一定是偶数。因为逻辑像素不是实际的像素,只是长度单位,例如一个逻辑像素可以转换为1.5像素。

iPhone 4的设备像素比为2,这意味着一个逻辑像素的长度被转换成两个渲染像素的长度。因此,一个逻辑像素(宽一个像素,高一个像素)转换为四个渲染像素(高两个像素,宽两个像素)。其他设备的像素比为3或4,因此一个逻辑像素可以渲染为9或16个逻辑像素。

在这一点上,你可以假设我们已经完成了,但还没完成。另外一件事即将发生:渲染像素必须绘制在真实屏幕上。

物理像素

对于大多数设备,在物理设备的屏幕上显示渲染像素不会涉及多余的转换。此时,渲染像素的大小和屏幕上的物理像素的大小相等。
但在某些设备中,如iPhone 6 Plus中,物理像素分辨率比渲染像素分辨率小,渲染像素和物理像素大小不等,需要对渲染像素进行转换。

然而,不是所有设备都这样。一些设备(比如iPhone 6 Plus,或者是具有缩放分辨率的视网膜屏幕的MacBook Pro)以比实际屏幕可以显示的更高的像素密度(这样像素尺寸较小,但图像尺寸更大)来渲染像素。当渲染像素显示在屏幕上时,渲染的图像会缩小到屏幕的大小。

这个网站展示了这种渲染产生的图形:
http://oleb.net/blog/2014/11/iphone-6-plus-screen/

PenTile屏幕

为了完整性起见,我还将说明一个物理像素并不总是意味着相同的东西。在一个普通的屏幕上,一个物理像素有三个子像素,子像素的颜色分别是RGB屏幕能够显示的三种颜色:红色、绿色、蓝色。但是,一些屏幕(例如PenTile OLED屏幕)每个像素只有两个子像素。这意味着一个渲染像素通常由多个物理像素来表示,因为渲染像素会从一个相邻的像素“借用”一个着色的子像素。

sub-pixels per pixel

结论

逻辑像素,用于组件属性,是在不同设备上都大致相同的长度单位,而不是实际颜色点。逻辑像素首先被转换为渲染像素,然后缩放到实际的设备像素,而设备像素可能是有三个不同子像素的实际像素。

translation of three pixels

(PaintCode网站有一个很好的指南,它解释了这个特殊的过程 —— 从逻辑像素到渲染像素到物理像素 —— 对于iphone。)

实际上,这种级别的细粒度细节只是作为为信息提供的:开发者需要知道的是,Appway的“一个像素”实际上并不是屏幕上的一个物理像素。相反,它是长度单位,在不同的设备上大致相同。