将图像转换为 pdf,然后再转换回图像格式:
$ convert in.jpeg out.pdf
$ convert out.pdf out.jpg
$ diff in.jpeg out.jpg
> Binary files in.jpeg and out.jpg differ
尝试不同的工具,
$ gm convert in.jpeg out.pdf
$ pdfimages out.pdf -j orig
$ diff in.jpeg orig/out-100.jpg
> Binary files orig/out-000.jpg and in.jpg differ
这些工具是否在后台进行一些压缩,或者 PDF 的工作方式是这样的,即:它总是有损的?
图像元数据怎么样?是否可以将它们保存在 PDF 中?
答案1
PDF 是一种容器格式,而不是图像格式。因此,应该可以将图像嵌入 PDF,然后提取它,而无需重新压缩。但是,ImageMagickconvert
在创建 PDF 时会压缩图像,并且convert
不会从 PDF 解析 PDF 文件,而只是获取其外观的快照,因此实际的重新压缩会发生两次。
您可以使用其他工具来避免这种情况。例如,img2pdf将图像按原样嵌入到 PDF 文档中,并pdfimages
从poppler
(或poppler-utils
— 包名称因操作系统和包管理器而异)提取嵌入的图像。
$ img2pdf -o out.pdf in.jpeg
$ pdfimages -all out.pdf out
$ diff in.jpeg out-000.jpg
$
答案2
答案在最后
背景
对于简单的“标准”jpeg PDF 输入/输出不受影响,即输入将是输出的二进制副本,但是,这仅适用于库存 PDF 和在提取过程中不会改变 PDF 内容(例如分辨率或压缩)的提取器。
该文件是来自维基百科的图像,由 Windows CMD 构建,前 16 行是
%PDF-1.7
%ANSI
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 841.5 594.75 ]/Rotate 0/Resources 4 0 R/Contents 5 0 R/Parent 2 0 R>> endobj
4 0 obj <</XObject <</Img1 6 0 R>>>> endobj
5 0 obj <</Length 61>>
stream
500.000 000.000 000.000 477.000 170.750 053.875 cm /Img1 Do
endstream
endobj
6 0 obj <</Type/XObject/Subtype/Image/ColorSpace/DeviceRGB/BitsPerComponent 8/Filter/DCTDecode
/Width 500/Height 477/Length 36287 >>stream
ÿØÿà JFIF H H ÿþ [Photo by David Crawshaw, 2002-01-28
Image composition by David Crawshaw, 2004-09-08, GFDLÿÛ „
请注意,“密度”可能会发生变化(放大/缩小/扭曲),但总像素应保持在 500x477(PDF 中没有 DPI 这样的东西)至关重要的是,用于插入和提取的源图像流大小都是/Length 36287
使用标准 Jpeg /DCTDecode
(Std 而不是奇异压缩),预告片是
endstream
endobj
xref
0 7
0000000000 65535 f
0000000016 00000 n
0000000061 00000 n
0000000115 00000 n
0000000228 00000 n
0000000272 00000 n
0000000380 00000 n
trailer
<</Size 7/Info <</Producer (Cmd2PDF)>>/Root 1 0 R>>
startxref
36826
%%EOF
因此,36287 的图像被包装为 header=36826+trailer(37,058 字节)因此 PDF 开销大小为 771 字节,因此该 PDF 的精简程度和实用程度几乎是极限。任何进一步的尺寸减小都将以降低质量为代价。
对于 Tiff 或其他图像类型,标题元数据通常会被剥离,因此在提取时核心数据会非常相似,但文件不可能 100% 相同,同样的问题会影响大多数其他需要改变结构的图像类型,比如透明的“Alpha”层(PNG)。
因此,一般来说,简单的 24 位 RGB.jpg 对于输入和输出可以是二进制相同的,与 MP4 视频流相同,其他许多内容通常会以不同的风格进行压缩。
许多用户惊讶地发现,除非图像质量下降,否则“压缩”我的 jpegs.pdf 没有任何区别,因为它在 PDF 中已经被最佳压缩了。
答案
-
- GM 转换正在调整图像,而许多其他 PDF 编写器则不会这样做,它们只是将文件按比例放大/缩小的区域加上其内部元数据注入。PDF 本质上是“无损”的图像数据或具有相同的有损内容,因此子集字体隐含有损,但完整字体是无损的。
-
- 如果插入和提取时不发生改变,则压缩和可见的元数据(如上例所示)将被保留。