先问两个问题,你是否思考过:
- 为什么matplotlib绘图,有一个“figure"图形对象,还需要“canvas"画布对象?又不是真的在画布上绘画!
- matplotlib中绘图时是如何实现坐标定位的?
在photoshop中也是如此,在学习计算机绘图时,经常见到一些概念,如:
- DPI
- PPI
- 图像
- 画布
- 图像尺寸
- 画布尺寸
- 分辩率
- inches
- 像素(pixels)
- Axes
- Axis
- …等
像我这样的草根,初期常拧不清它们,并且困惑于:为什么要弄出这么多“差不多”(相似)的概念?
我也很长时间停留在对它们的一知半解上,因为那时也认为,大致知道这此概念就“差不多了”,我只要能画出图形来即可!
其实理清这些概念很重要,它是输出图像质量、绘图坐标设置、matplotlib一些参数设置等的基础,甚至有时直接决定了你自由操控matplotlib的能力(如坐标变换)。在对它们模糊的时候,使用matplotlib,很多参数设置的目的和产生的结果也就是模糊的。
等我花一些时间理清楚它们后,过去对matplotlib中一些不能理解的地方也豁然开朗了。
本打算把类似上面的一些基础性概念在一篇文章中做个总结,因篇幅的限制,需要分几篇了。
显示器的尺寸
计算机绘图过程中,绝大多数时间,我们都是在显示器(本文以液晶显示器为例)上操作、查看图像。
显示器有一个最直接、固定的参数,就是经常说的屏幕尺寸。
屏幕尺寸(物理尺寸),用英寸 inches表示,它是矩形"液晶面板"的对角线长度。比如,17寸显示器,23.1寸显示器…等。
矩形的对角线是23.1 inches,显示器的长、宽是多少呢?这就引入了屏幕比例的概念,如标准的4:3,16:9。
1 英寸 = 2.54 厘米。
我正在用的台式机的显示器是:23.1英寸,16:9。
用 l 、w 分别表示液晶面板的长和宽,有:
解上面的方程组即可大概地计算出显示器屏幕的长和宽了,单位是厘米。
计算结果是:
- l = 51.55556 ≈ 51 厘米
- w = 28.76559 ≈ 29 厘米
我们可以用尺子量一下屏幕显示区的长和宽。更精确的是使用硬件检测软件获取显示器的详细信息,我的显示器检测结果如下:
小结:
- 用液晶面板的对角线长度,用英寸、inches作单位,表示显示器的尺寸 ;
- 屏幕的长宽比叫屏幕比例,如 16:9;
- 基于上面的约定计算出屏幕的物理长、宽,一般用厘米或英寸表示。
在matplotlib中,有一个**display
**坐标系统,就是基于这个屏幕构建的坐标,所以用inches或像素标识。
后面会专题讨论matplotlib中的各种坐标系,上面的知识会有助于你的理解。
液晶显示器的“像素”pixel
液晶是一种特殊的有机化合物, 在常温条件下,它呈现出既有液体的流动性,又有晶体的光学各向异性,因而称为“液晶”。
液晶的物理特性是:当通电时,排列变得有秩序,使光线容易通过(看起来就是亮);不通电时排列混乱,阻止光线通过(看起来就是灰暗)。让液晶如闸门般地阻隔或让光线穿透。
液晶层中的液滴都被包含在细小的单元格结构中,**一个或多个单元格构成屏幕上的一个像素。**在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小光阀。这样就可以控制每个像素的亮度和颜色了。
显然,相同尺寸的液晶层上划分的单元格(像素)越多,显示器的显示精度就越高,显示出来的图像就越细腻,但这种显示器的制作工艺难度就会增加,成本也会增加。
显示器就是通过在一个一个单元格(像素)中填充不同的颜色来表达图像的。
像素就是最小的显示单元格,在一个单元格中只能显示相同的颜色。
分辨率 resolution
我们在选购显示器时,非常关注的"分辨率"参数,它就与”像素“有关。像素常用字母PX表示。
分辨率,又称解析度、解像度。即显示屏幕区域被分解为多少个像素(单元格)。
虽然在系统中有设置显示器分辨的地方,但液晶显示器的最大分辨率在出厂后就是固定的了。能设置的仅是当前分辨率。下图是windows 10 系统设置显示分辨率的界面。
我的显示器最大分辨率是 1920*1080,即长向上有1920个PX,宽向上有1080PX
总的有 2073600 个像素,它就是我的显示器的的分辨率了。这个数字太大,不好理解,所以一般直接用类似 1920PX * 1080PX这样的形式来表示屏幕的分辨率,手机屏幕也是如此。
**题外话:**液晶面板的单元格划分在出厂时就固定了,为什么还能设置当前分辨率呢?
假如我将当前分辨率调整为1280px*960px
,按照定义,长向就是1280个像素,宽向就是960个像素。其实并不是你改变了显示器分辨率,而是操作系统欺骗了你。操作系统通过一系列运算将1920*1080
个单元格矩阵变换为1280*960
个模拟像素矩阵呈现给你。所以,就有了当前分辨率和最大分辨。
PPI 是什么?
基于分辨率的含义,人们还用每英寸长度上像素个数来表示屏幕分辨率,即 Pixels per inches,缩写为 PPI。
我的显示器长向上最大为1920像素,物理长度是51厘米(折合20.078英寸),每英寸长度上有1920 px / 20.078 inches ≈ 96 PPI。
所以,有时又说我的显示器分辨率是 96 PPI。
也有人把他说成 96 DPI,这是不严格的。对于显示器分辨率,严格来说应该用 96 PPI。当然你很清楚它们的含义时,反而混用也没有关系了。
DPI 又是什么?
DPI 是 Dots per inches的缩写。DPI是一个与打印机、印刷紧密相关的概念。
打印机是通过一个一个的墨点来打印图像的,每个墨点的色彩只能是一样的,打印机在每英寸上可打印的点数就是DPI。显然DPI越大,打印出来的图像就越细腻。所以,常用DPI作为打印机的分辨率来表示打印机的最大可打印质量。
为什么说是最大可打印质量呢?即这台打印机最大打印分辨率,但实际打印分辨率还与图像的分辨率有关。
一般打印机的分辨在150-300DPI,高的能达到600DPI。
我们用100%的比例打印图像:
- 假如有一台打印机的分辨率是600DPI,要打印一幅分辨率(后面会讨论图像分辨率)为300DPI的图像,打印机是不可能改变图像分辨率的,打印到纸上的照片的分辨率就是300DPI,因为图像的原始点是这么大,即使打印机用了两个点表达图像中的一个点,但这两个点是一样的色彩。
- 反过来,用一台300DPI的打印机,打印一幅600DPI的图像,打印出来的照片也只能是300DPI的。因为打印机无法表达更小的点。
总结:
严格来说:
- 像素就是显示器、图像被分割成的最小格子;
- 单个格子越小,每英寸上格子就越多,即像素越大,显示就越细腻;
- 单个格子越大,每英寸上格子就越少,即像素越小,显示就越粗糙;
- 显示分辨率用PPI,Pixels Per Inches;
- 打印分辨率用DPI,Dots Per Inches。
理解这些概念有助于你自由操控 matplotlib 。
(This end.)