像素相关概念:PPI、DPI、设备像素、独立像素

简介: 像素相关概念:PPI、DPI、设备像素、独立像素

前言


我相信对于像素,英文「pixel」,缩写「px」,这个概念并不陌生吧,不管是设计师设计图片用的单位 px,还是前端工程师在 css 里面的单位 px等等,很多领域都会用到这个单位,但是当我问他们一些问题的时候,基本上都答得不好。

比如:


  • iPhone 6 的分辨率是 750 x 1334 像素,然而我们我们在写 css 的时候是以 375 x 667 来调的;


  • 为什么我们做的一个网页在 pc 端可以正常显示,在移动端也可以正常显示,但是有时候又不正常显示;


  • 我们如果在 pc 端把浏览器的宽度调到只有 200px 宽,里面写一个 100px 宽的 div ,然后再调整浏览器的放大为 200%,然后这个 div 可以充满整个显示器。


如果都能答上来,已经很不错了哦!


像素


定义:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。 —— 百度百科


注意: 我觉得这里最关键的是『单位』,像素是一个单位,而不是一个点,我认为理解为一个长度单位比较好理解,后面我会解释为什么我会觉得是一个长度单位比较好理解。

我在很多文章里看到的定义是,像素就是组成图像的一个一个的点,这会让人感觉像素是个面积单位,我觉得这样有点不妥,并不是不对,要根据上下文而定。

比如 设备像素比(device pixels ratio),简称 DPR,DPR = 设备像素 / 设备独立像素。现在我们就拿 iPhone 6 来做例子,我们可以通过 window.devicePixelRatio 获取设备的 DPR 为 2,设备独立像素,在这里可以认为是 css 像素,整个 iPhone 6 的像素点就有 375 * 667 个。


然后根据上面的公式得出:


总设备像素 = 总 css 像素 2 = 375 667 2 。然而实际上总的设备像素是 750 x 1334 个像素点。


如果我们把像素理解为一个长度单位,那么这个 2 就是 水平的总设备像素 = 2
水平的 css 像素 = 2 375,垂直的总设备像素 = 2 667. 所以总的像素点的个数就等于 = 4 375 667 = 750 * 1334.


前面这个例子有可能现在还看不懂,不明白设备像素、设备独立像素这些概念,后面介绍了再来理解可能容易点,现在就是想带着它是个长度单位来理解。其实 DPR = 设备像素 / 设备独立像 (是在同一个方向,一维的)


设备像素(DP)


定义: 设备像素又称物理像素,其尺寸大小是不会变的,从显示屏从工厂出来的那刻起,物理像素点就不会变了。


实例:


iPhone 6 的分辨率是750 x 1334 ,那么这个 750 就是代表 750 的物理像素,是从手机出厂的那刻起,就不会变了,750 表示的就是手机的宽是 750px。这个应该比较好理解。


设备独立像素(DIP)


定义:设备独立像素又称逻辑像素,其尺寸大小是相对的。是一种物理测量单位,基于计算机控制的坐标系统和抽象像素。


其实这个也很好理解,逻辑像素嘛,不就是我们平时用的 CSS 像素么,在 Android 中交设备独立像素。所以 设备独立像素 = CSS 像素。


设备像素比(DPR)


设备像素比 DPR(devicePixelRatio) 是默认缩放为100%的情况下,设备像素和CSS像素的比值。 DPR = 设备像素 / 设备独立像素(是在同一个方向,一维的)

640.jpg

这个概念主要是为了移动设备提出来的,最开始没有 DPR 的概念。但是随着技术的发展,从 iPhone 4 开始,苹果公司将 iPhone 4 的分辨率提高了一倍,但是尺寸没有变化,这意味着大小相同的屏幕上,像素多了一倍(一个方向上,像素点其实是 4 倍),但是屏幕的尺寸没有变化,因为以前设备像素与逻辑像素的比例一直是 1 : 1,都没人去关心这个,而 iPhone 4 的 DPR 为 2 了,所以就有了 DPR 的概念。这也诞生了 retina视网膜屏幕,后面讲 PPI 的时候再具体说。


DPI 和 PPI


前方高能,这两个概念比较容易搞混,新手常常难以区分,包括百度百科所给的概念都互相矛盾,属于难点。

640 (1).jpg

在百度百科上,PPI 定义是每英寸(英寸是个长度单位)所包含的像素数目。而后面又说单位面积的像素数目跟多,图像越清晰。一会儿又说是单位长度,一会儿又说是单位面积。因为英寸是长度单位,就是用来描述线段的,那么所包含的像素数目,此时像素我所理解的是长度单位;而后者说单位面积像素数量,此时我只能理解成像素是一个面积单位。这会让没有真正理解像素或者 PPI 的人迷惑。


现在我还是拿 iPhone 6 的例子来说明到底 PPI 应该是个啥。


我们都知道 iPhone 6 的分辨率是 750 x 1344,对角线长度是 4.7 英寸,PPI 是 326(不知道这些的自己查),但是这个 326 是怎么来的呢?现在我们就来计算下

640.png

因为我们并不知道手机的长宽的尺寸,一般厂商只会给对角线的尺寸。


设:长尺寸为 x 英寸,宽的尺寸为 y 英寸,那么就可以得到手机面积 s为: s = x^2 + y^2  (1),

根据勾股定理可以得到 (4.7 英寸)^2 =  x^2 + y^2   (2)

根据 (1)(2)可得  s = x^2 + y^2 =  (4.7 英寸)^2

现在我们把总面积算出来了,然后再来算总的像素个数。一般像素点是正方形,所以一个点为一个像素平方。所以有:

750 px * 1344 px = 750 x 1344 px^2(注意单位是像素平方)

此时就有 PPI = 750 x 1344 px^2 / (4.7 英寸)^2 = √ 750 x 1344 px / 4.7 英寸


所以就有 PPI 等于每平方英寸的像素点个数(1 个像素点为 1 平方像素),单位是 px^2/ 英寸^2 ; 也等于每英寸多少像素。


所以说其实百度百科那个解释说错也有错,说没错也没错,只是说比较容易让人误解。看到这里我相信应该大家都明白 PPI 道理是什么了吧。


DPI(Dots Per Inch)和 PPI(Pixels Per Inch)都描述了图像的分辨率(或清晰度),但它们不是同一件事。PPI 描述了一英寸数字屏幕上显示的正方形像素的数量(通常在 67-300 之间)。另一方面,DPI 是指打印文档中墨水物理点的数量的打印术语。它们俩其实是差不多的,只是在使用的范围不一样,因为「点」这个还是比较抽象的,当使用电脑屏幕的时候,就是像素点;而当你打印或者印刷东西的时候,就是喷墨点。或者你可以把我们刚推出来来的等式,如果是每平方英寸像素点个数就可以理解为 DPI,每英寸像素理解有 PPI。


PPI 越高,看起来越清晰。


Retina 显示屏


Retina 显示屏是苹果公司首先提出来的,具备足够高像素密度(指的是 PPI 大于 300 的)而使得人体肉眼无法分辨其中单独像素点的液晶屏。最初采用该种屏幕的产品是 iPhone 4,其屏幕分辨率为 640 x 960(每英寸像素数为 326 ppi)。这种分辨率在正常观看距离下足以使人肉眼无法分辨其中的单独像素。

640 (2).jpg

注意:Retina 不是分辨率,也不是单独指PPI,而是指视觉效果。retin屏幕指在正常视线距离内,肉眼很难看到像素的的屏幕。脱离视线距离谈retina就是流氓,50寸的1080P电视,你50CM内看大果粒,50米外看就是retina屏幕。


后言


下一篇文章也是跟这相关的,谈 移动端的适配问题(ppi 适配、resolution 适配、 dpr 适配),理解移动端的三种 viewport 。

大家好,我是桃翁,我为自己代言!

目录
相关文章
|
测试技术 应用服务中间件
如何用自己电脑做服务器,绑定域名建一个个人网站
使用自己的电脑,下载一个tomcat服务器,并将域名解析到本机,这样就可以发布自己的网站了。不过,关机之后网站便登不上去了。这样做只是为了我们可以更好的开发调试自己的工程,网站上线之后可以让更多的朋友帮你找bug。这里仅仅需要花十几块钱买一个域名就可以了。以下介绍都是在已买域名的基础上。 购买域名之后开始解析自己的域名到本机,以下以腾讯云购买的域名为例,其他大同小异: 1,,添加该域名
5777 0
|
存储 前端开发 JavaScript
OneCode 一路走来
OneCode 第一个版本,以V5版本的引擎为核心,将平台全部600余组件的2/3贡献到社区版本,同时为方便大家构建自身的工程体系,还会同步开源 OneCode V3版本的支持环境VFS(JAVA开发)虚拟存储系统,以及配合V3 部署使用的 OneCode Server 和相关的部署管理插件。 V4及V5部分由于其技术成熟度以及商业层面的考虑暂时不能在当前版本中发布,但为了方便大家自定义组件测试以及开发插件需求,我们将推出JDSCloud 的在线开发与编译功能。大家可在线使用一码通编辑器来编写和测试插件程序,测试完毕编译打包下载即可。
|
测试技术 API 开发工具
在Python中实现安卓手机自动化
在Python中实现安卓手机自动化
2162 0
|
网络协议
关于mDNS
在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的 ip 地址,但是有些时候,你并不知道对方的 ip 地址,因为一般使用 DHCP 动态分配 ip 地址的局域网内,各个主机的 IP 地址是由 DHCP 服务器来帮你分配 IP 地址的。
3186 0
|
Linux Shell 网络虚拟化
[翻译]Macvlan 网络驱动入门
Macvlan 网络驱动入门 Macvlan网络驱动是为了在Docker的用户的使用场景中提供一个稳定的,生产可用,高性能的网络驱动。本文翻译自Docker官方的macvlan文档, 原文链接:https://docs.
8170 0
|
机器学习/深度学习 存储 编解码
高效神经网络架构的正确打开方式! | EMO:结合 CNN 和 Transformer
高效神经网络架构的正确打开方式! | EMO:结合 CNN 和 Transformer
1784 0
|
存储 Linux 网络安全
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1(上)
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1
1563 0
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1(上)
|
Java Android开发
AndroidStudio 修改aidl路径(添加AIDL文件夹)
AndroidStudio 修改aidl路径(添加AIDL文件夹)
909 0
AndroidStudio 修改aidl路径(添加AIDL文件夹)
|
JavaScript 前端开发 编译器
Vue3基础(26)___defineProps、defineEmits、defineExpose、defineModel组件通信、defineOptions
本文介绍了Vue 3中`<script setup>`语法糖的使用,以及如何在Vue 3的组合式API中使用`defineProps`、`defineEmits`、`defineExpose`和`defineModel`进行组件通信和属性暴露。同时,还解释了`defineOptions`的作用,它可以用来配置组件的选项,例如禁用属性的自动继承。
1771 2

热门文章

最新文章