php在pdf中检测图像的dpi

jac*_*cob 0 php pdf postscript dpi

我已经Imagick::getImageResolution在PDF上尝试了一些测试,我无法弄清楚如何获得嵌入在PDF中的图像的分辨率(和颜色空间).我试过从PDF中删除图像,但在这个过程中,似乎DPI被任意设置为72而不是我做的事情.

我在1564529中看到有人说DPI与PDF无关,但事实并非如此(当图像嵌入到PDF中时,有关图像的几个属性,如分辨率,在PostScript中定义).PHP中是否有一种方法(可能使用PSLib?)来确定嵌入图像的DPI是什么?

Ken*_*enS 5

PDF(或PostScript)中图像的"dpi"比您想象的更模糊.这是因为可以以不同的比例呈现PDF,因此actul dpi会有所不同.

您是正确的,有关于文档中嵌入的图像的比例因子的信息.这是当前转换矩阵,但它不像单个值,甚至单个矩阵那么简单.

CTM将坐标映射到理想化的"用户空间",其名义上以点(每英寸72个)定义,但是无限可细分.在渲染方面,"用户空间"进行了进一步的转换以适当地将其缩放到"设备空间",因为设备可能不是72 dpi,所以需要进行转换.

您可以在PDF参考手册中找到更全面的解释,尤其是1.7参考中的4.2.1节.

因此,您需要做的就是从图像字典中获取声明的/ Width和/ Height,并应用/ Matrix来确定图像在用户空间中的大小.鉴于用户空间实际上是72 dpi,那么你就会知道图像被缩放到多少英寸,图像包含多少像素,而简单的除法可以为你提供所需的答案.

实际上,在可能的情况下,这将起作用.但是,从您的角度来看,问题之一是,连接矩阵以影响当前缩放是可能的,实际上很常见,因此只需查看应用于图像的矩阵就不会给出应用于该图像的比例因子.图像,因为其他东西可能已经缩放了CTM.此外,PDF包含"UserUnit"kludge,它允许文件更改用户空间的默认缩放.

因此,计算图像"dpi"的唯一方法是将页面描述解释为渲染图像的点,计算出该点的总缩放率,然后计算图像覆盖的面积.然后给出图像的宽度和高度,计算出它的dpi.

顺便说一下,这对你来说是一个难题; 完全可以使用相同的图像数据在PDF中多次绘制相同的图像.您只需要包含一次图像数据.如果我绘制一个100像素×100像素的图像并将其绘制为覆盖一平方英寸,则分辨率为100 dpi.现在我绘制相同的图像,但我将其缩放到半英寸.渲染图像的分辨率现在为200 dpi.

那么"形象的dpi"是什么?