您所要求的,要检索任何数字的物理显示尺寸 cm,如果没有很多启发式方法,就无法完成,也就是说,我们作为网络开发人员没有办法为我们所有的访问者做这件事。
关于你的公式:
这是衡量一英寸内可以容纳多少个点的指标。该单元通常用于打印机或扫描仪。然而,监视器没有点,因此 DPI 对它没有意义。
像图像这样的数字媒体可能会在其元数据中嵌入 DPI 信息,但这只是对扫描仪在生成文件时使用的设置的提示,或者作者提示它应该打印的预期尺寸。只有少数专用软件会使用这些信息,而您的网络浏览器不在其中。
数字像素 -(光栅图片单元)。
这是raster graphic 中可见信息的最小单位。这些信息可能以多种方式存储,但不能通过创建新的虚假数据以外的其他方式进行分割。这通常是我们在 1920x1080px 中所指的“px”。
为了更容易理解,我们可以使用位图的情况,其中每个数字像素在文件中由它自己的一组位表示,为了更容易理解,让我们举个例子8bit位图图像(单色,一般为灰度)。这里 8 位用于表示单个数字像素(一个色点)。例如,我们可以用这些信息制作一个 2x2px 的位图:
[2, 125, 255, 125, 255]
| | | | - pixel (2,2) 100% intensity
| | | - pixel (2,1) 50% intensity
| | - pixel (1,2) 100% intensity
| - pixel (1,1) 50% intensity
- width (nb of digital pixels per line)
/* height can be determined by the `length of data array / width` */
但请注意,所有光栅图像都不是位图,它们也不都有这种 bits-pixel 关系,但它们都有数字像素的概念,就像在最小的块中一样他们确实拥有颜色信息。
明确了这两个概念,我们就可以解释一下你的公式是什么意思了:
const pxTocm = (pixels, DPI) => pixels * 2.54 / DPI;
如果我们拍摄 150*150 像素的光栅图像,并使用分辨率为 300DPI 的相当好的喷墨打印机打印,这个公式将正确地给出 1.27 厘米或 0.5 英寸
但这只有在我们知道打印分辨率的情况下才有效。
好吧,那我们就用屏幕分辨率吧。
PPI - 每英寸像素数。
这是我们大多数显示器所需要的。与 DPI 非常相似,它测量的是显示器在一英寸内包含的物理像素的数量。
显示器的物理像素因使用的显示器类型而异,但例如在大多数 LCD 显示器中,一个物理像素由三个二极管组成,一个红色、一个绿色和一个蓝色,也称为子像素。
您可以看到组成单个像素的所有三个子像素组件。
图片来源:CC-BY-SA 4.0 Kapteek88 for wikimedia.org
所以我们确实可以将你的公式重写为
const pxTocm(pixels, PPI) => pixels * 2.54 / PPI;
但这只有在图像以 100% 显示时才有效,即一个 数字像素 占用一个 物理像素,这在网络上很少发生,此外,我们需要知道这个 PPI 值。
通过 Web API,我们无法知道 PPI 值。我们甚至无法确定我们正在向监视器显示,它很可能是一个光束投影仪,PPI 的概念对此毫无意义。
我们得到的最接近的是屏幕分辨率(在Window.screen 对象下,但这只会给我们显示显示器拥有的数字像素的数量;我们仍然错过了这个显示器的实际物理尺寸.
PPI = Math.hypot(screen.width, screen.height) / physical_size_of_diagonal
// and we don't have any way to find this diagonal...
但是如果不是我的屏幕的PPI,我听说window.devicePixelRatio 是什么?
为了解释这一点,我们首先需要解释一下什么是CSS px
CSS px - 读取为“像素”但不是像素。
px 是一个单位,called by W3C “CSS 的魔法单位”。它的值取决于支撑,以及它到观众眼睛的距离(!)。 Here 您可以找到关于 CSS 的参考像素 的非常容易理解的解释。
基本上,如果您在距离较远的地方在显示器上观看,或者在较近的距离在手机上观看,它的大小应该是相同的。
我希望您明白将其映射到现实生活中的测量是多么困难。
window.devicePixelRatio
该值表示用于显示CSS px 的物理像素数。
这可能很有用,因为有了这个值,我们可以精确地将一个 css px 映射到正在使用的物理像素数。
如果我们知道 CSS px 真正代表什么,即(我们是在显示器上还是在移动设备上或其他设备上?),以及我们用户显示器的当前 PPI 分辨率是多少(但我们不知道) ,那么我们就可以测量显示器上显示的尺寸。 (但我们不能)。
所以,是的,我们可以在没有 OS 缩放的 96PPI 桌面显示器上,获得@JuMoGar 在他们的答案中提供的种类或公式(请注意,尽管他们弄错了):
const CSSpxTocm = (CSSpx) => CSSpx * 2.54 / (96 / devicePixelRatio);
其中96 是 CSS px 单位使用的 96PPI 硬编码值,以 96 英寸为单位。
但只要在手机上试一试,你就会发现它有多坏。 As a fiddle if it's easier from mobile.
const CSSpxTocm = (CSSpx) => CSSpx * 2.54 / (96 / devicePixelRatio);
console.log(CSSpxTocm(96) + 'cm');
.test {
border-top: 3px solid blue;
height: 10px;
width: 96px;
}
<div class="test px"></div>
在我的 125PPI 笔记本电脑的显示器上 (13.3in 1280x1080px) 已经是错误的了,说是 2.54 厘米,而实际上是 2.2 厘米左右,但在我的 Galaxy S6 手机上,@ 987654327@ IRL,大约是 1.7 厘米。
为什么?因为屏幕的 PPI 约为 577,但它仍然只使用一个 物理像素 每个 CSS px。这意味着 devicePixelRatio 仍然是 1,但 PPI 与预期的 96 相差甚远,这个公式返回了荒谬。 (S6屏幕的对角线为5.1in,~12.9cm)