php 检测 pdf 中图像的 dpi

问题描述 投票:0回答:3

我在 PDF 上使用

Imagick::getImageResolution
尝试了一些测试,但我不知道如何获取嵌入在 PDF 中的图像的分辨率(和色彩空间)。我尝试过从 PDF 中提取图像,但在这个过程中,无论我做什么,DPI 似乎都被任意设置为 72。

我在1564529中看到有人说DPI对PDF来说并不重要,但事实并非如此(当图像嵌入到PDF中时,有关图像的几个属性(例如分辨率)在PostScript中定义)。 PHP 有没有办法(可能使用 PSLib?)来计算嵌入图像的 DPI 是多少?

php pdf dpi postscript
3个回答
6
投票

PDF(或 PostScript)中图像的“dpi”比您想象的更加模糊。这是因为可以以不同的比例渲染 PDF,因此实际 dpi 会有所不同。

您是对的,文档中包含有关图像比例因子的信息。这就是当前变换矩阵,但它不是单个值那么简单,甚至不是单个矩阵那么简单。

CTM 将坐标映射到理想化的“用户空间”,该空间名义上以点(每英寸 72 个)定义,但可以无限细分。在渲染时,“用户空间”应用了进一步的转换,以将其正确缩放到“设备空间”,需要进行转换,因为设备可能不是 72 dpi。

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

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

确实,在某些情况下这会起作用。然而,从您的角度来看,问题之一是连接矩阵来影响当前缩放是可能的,而且确实很常见,因此简单地查看应用于图像的矩阵不会给出应用于该图像的缩放因子图像,因为其他东西可能已经缩放了 CTM。此外,PDF 包含“UserUnit”拼凑,它允许文件更改用户空间的默认缩放比例。

因此,计算图像“dpi”的唯一方法是将页面描述解释为图像渲染的点,计算出该点的总缩放比例,并从那里算出图像覆盖了多少区域。然后给定图像的宽度和高度,计算出它的 dpi。

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

那么“图像的 dpi”是多少?


0
投票

0
投票

DPI 对于 PDF 来说并不重要

正如 KenS 指出的那样,同一张图像每英寸可以有任意数量的像素(PDF 中也没有英寸,我们说它们以“名义上”72 个大型打印机点开始,假设大约为 1 英寸,但它们可以是每个用户 PDF 单位 2 英寸)。 A4 或 A5 或 A3 的尺寸在打印时应用,即应用比例时,使得一个点可以是一英寸纸张的 1/300 或 1/150 等。

enter image description here 此处有一张图像和 2 种显示尺寸。该图像在任何比例下都是 24 x 25 像素。并且可以压缩为无损格式(如 gif、png 或 tiff,标称 96 个画布单位导入/导出)或扩展为 JPEG,名义上每英寸 72 个打印机点。

Pdfinfo 将显示当前的 ppi 值。一张是另一张的两倍,但两张图像的大小相同,对象编号为 4。因此 24.5 ppi 或 49.5 ppi 并不重要,在 600 dpi 打印机上以 1:1 打印 1" 和 2"。

pdfimages -list "HelloWorldR&W.pdf" page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio -------------------------------------------------------------------------------------------- 1 0 image 24 25 index 1 1 image no 4 0 49 50 75B 100% 1 1 image 24 25 index 1 1 image no 4 0 25 25 75B 100%

%PDF-1.0
%Åѧ¡
1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj
2 0 obj <</Type/Pages/Count 1/Kids[3 0 R]>> endobj
3 0 obj <</Type/Page/MediaBox[0 0 144 144]/Rotate 0/Resources<</XObject<</Img0 4 0 R>>>>/Contents 5 0 R/Parent 2 0 R>> endobj
4 0 obj <</Type/XObject/Subtype/Image/Height 25/Width 24/BitsPerComponent 1/Length 75/ColorSpace[/Indexed/DeviceRGB 1<FF0000FFFFFF>]>> stream
ÿÿÿÿÿÿÀmß[}ÑoEÑ[EÑqEßE}ÀUÿñÿÁ«Á¬ÛZcýÖÇÈ"}ÿÕïÀMsß`§Ñ]9ÑNÑE·ßLÇÀA[ÿÿÿÿÿÿ
endstream
endobj
5 0 obj <</Length 101>> stream
q
1 0 0 -1 18 54 cm
35 0 0 -36 0 36 cm
/Img0 Do
Q
q
1 0 0 -1 71 144 cm
70 0 0 -72 0 72 cm
/Img0 Do
Q

endstream
endobj

xref
0 6
0000000000 00001 f 
0000000015 00000 n 
0000000060 00000 n 
0000000111 00000 n 
0000000237 00000 n 
0000000472 00000 n 

trailer
<</Size 6/Info<</Producer(JScrip2pdf)>>/Root 1 0 R>>
startxref
623
%%EOF
	
© www.soinside.com 2019 - 2024. All rights reserved.