前言:
眼前看官们对“pythondpi”大致比较关注,姐妹们都需要剖析一些“pythondpi”的相关知识。那么小编同时在网摘上收集了一些有关“pythondpi””的相关内容,希望大家能喜欢,看官们快快来学习一下吧!学Matplotlib需要拧清的概念之Inches, PPI, DPI
先问两个问题,你思考过:
为什么matplotlib绘图,有一个“figure"图形对象,还需要“canvas"画布对象?又不是真的在画布上绘画?mpl中是如何实现坐标定位的?
在photoshop中也是如此。
在学习计算机绘图时,经常见到一些概念,如:
DPIPPI图像画布图像尺寸画布尺寸分辩率inches像素(pixels)AxesAxis.......等
像我这样的草根,初期常拧不清它们,并且困惑于:为什么要弄出这么多“差不多”(相似)的概念?
我也很长时间停留在对它们的一知半解上,因为那时也认为,大致知道这此概念就“差不多了”(马马虎虎),我只要能画出图形来即可!
其实理清这些概念很重要,它是输出图像质量、绘图坐标设置、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来说很重要。
你的赞和评论就是我前进的动力!
关注关条号”Python草堂“,轻松阅读下一篇:学Matplotlib需要拧清的概念之图像分辨率、图像尺寸
标签: #pythondpi