JPEG 文件与 pdf 的 DCTDecode 流中包含的内容之间的区别?
Difference between a JPEG file and what is contained in a pdf's DCTDecode stream?
这个问题是关于 pdf 文件格式的内部结构及其使用 /Filter /DCTDecode
。
基本上,此过滤器允许使用与我们在 jpeg 文件中找到的内容类似(或相同)压缩的图像数据。
不耐烦地想要 include/display 我的小 javascript 生成的 pdf 文件中的 jpeg 图像 我试图简单地将 jpeg 文件的逐字内容插入代表图像的 pdf 流对象展示。
尽管我预计这不是 "standard" 方式,但有趣的是,它在一群观众中产生了正确的结果,其中包括 poppler、evince、xpdf 和 pdf.js。
我的 crude/layman 理解是 jpeg 文件包含一种文件容器的东西,例如MAGIC FILE STRING,以及告知图像宽度和高度的头文件。
问题寻求以下信息:
- 包含完整的 JPEG 文件是否正确,其中 pdf 格式需要
/Filter /DCTDecode
的流数据?
- 如果不正确,
/DCTDecode
数据的pdf流对象内容和JPGE文件格式有什么区别?
PDF 标准是专门编写的,因此 DCTDecode 过滤器接受基线 JPEG。请参阅 PDF 1.7 参考的第 3.3.7 节(我的副本中的 p84):
The DCTDecode filter decodes grayscale or color image data that has
been encoded in the JPEG baseline format.
规范中还有一些值得一读的说明,请在同一部分中详细了解所支持的内容。
只有在对 ColorSpace 和 /Decode 条目进行一些假设的情况下,这才会起作用。
如果您计划 creating/modifying 个 PDF 图像,您应该使用一个真正的 PDF 库,它将使用给定的过滤器创建一个真正的图像流。
其核心是寻求有关存储在 "JPEG file" 和 b) 中的 a) 数据内容之间差异的信息存储在嵌入 PDF 文件的 /Filter /DCTDecode
流对象中的数据内容。需要提及的一些方面是:
JPEG 文件
首先,更仔细地了解什么是 "JPEG file" 会有所帮助。事实证明,它的定义并不像人们预期的那样清晰:
"JPEG files" 的文件扩展名有一些变化,因为 .jpg
/.jpeg
都是常用的,更重要的是它们的文件格式是 JPEG/Exif
or JPEG/JFIF
.尽管这两种格式提供了一些不同的方式来将 JPEG 编码图像数据存储在文件中,但它们非常相似,因为它们都依赖于底层 JPEG Interchange Format
。
JPEG Interchange Format
中的数据组织方式是通过使用两个字节 0xFF<XX>
标记,例如:
0xFF 0xD8
图像开始 (SOI) 标记
0xFF 0xD9
图片结束 (EOI) 标记
0xFF 0xC4
定义霍夫曼 Table (DHT) 标记
0xFF 0xDB
定义量化 Table (DQT) 标记
0xFF 0xDA
扫描开始 (SOS) 标记
0xFF 0xC0
帧开始 (SOF 0) 标记
- 等...
JPEG/Exif
和 JPEG/JFIF
都保留了这些标记,并补充了一个 App0
应用程序标记 0xFF 0xE0
段,它提供了一些额外的(但不是绝对必要的)信息。
/Filter /DCTDecode
正如另一个答案中已经提到的那样,至少:
The DCTDecode filter decodes grayscale or color image data that has
been encoded in the JPEG baseline format.[.....]
The JPEG filter implementation in Acrobat products does not support
features of the JPEG standard that are irrelevant to images. In
addition, certain choices have been made regarding reserved marker
codes and other optional features of the standard. For details, see
Adobe Technical Note #5116, Supporting the DCT Filters in PostScript
Level 2.
暗示存储在 PDF /Filter /DCTDecode
流中的数据是 JPEG Interchange Format
,这意味着它不需要 JPEG/Exif
或 [=] 的额外标记14=]。
然而,考虑到通过标记提供 DCTDecode prefixed/marked 所需的相应信息的机制,它可以包含 JPEG/Exif
、JPEG/JFIF
甚至 JPEG/Adobe
的 APP0 制造商的数据流,而不妨碍它被正确解释。实际上,应该有可能在流数据中、标记段之间浪费了 space,或者在引入注释部分的 0xFF 0xFE
等标记中浪费了 space,不需要解码图像数据。
** Baseline/Progressive/Special **
JPEG Interchange Format,如前所述,它构成了数据如何存储在 "JPEG files" 和 pdf 的 /Filter /DCTDecode
流对象中的基础,它提供了不同类型的图像编码。
为了获得最佳兼容性,PDF 查看器可能只支持 "baseline" 编码。
底部line/Summary
有使用0xFF XX
标记的JIF(JPEG交换格式),它构成了JPEG文件格式的基础,也是/Filter /DCTDecode
所要求的格式。为了获得最佳兼容性(例如 PDF 1.4 及更早版本),仅支持 "baseline" 的 JIF 编码图像数据部分,在这种情况下,JPEG 文件的内容很可能在直接插入时正确显示pdf 的 /Filter /DCTDecode
流,假定应忽略任何 APP0 标记或其他标记。
这个问题是关于 pdf 文件格式的内部结构及其使用 /Filter /DCTDecode
。
基本上,此过滤器允许使用与我们在 jpeg 文件中找到的内容类似(或相同)压缩的图像数据。
不耐烦地想要 include/display 我的小 javascript 生成的 pdf 文件中的 jpeg 图像 我试图简单地将 jpeg 文件的逐字内容插入代表图像的 pdf 流对象展示。
尽管我预计这不是 "standard" 方式,但有趣的是,它在一群观众中产生了正确的结果,其中包括 poppler、evince、xpdf 和 pdf.js。
我的 crude/layman 理解是 jpeg 文件包含一种文件容器的东西,例如MAGIC FILE STRING,以及告知图像宽度和高度的头文件。
问题寻求以下信息:
- 包含完整的 JPEG 文件是否正确,其中 pdf 格式需要
/Filter /DCTDecode
的流数据? - 如果不正确,
/DCTDecode
数据的pdf流对象内容和JPGE文件格式有什么区别?
PDF 标准是专门编写的,因此 DCTDecode 过滤器接受基线 JPEG。请参阅 PDF 1.7 参考的第 3.3.7 节(我的副本中的 p84):
The DCTDecode filter decodes grayscale or color image data that has been encoded in the JPEG baseline format.
规范中还有一些值得一读的说明,请在同一部分中详细了解所支持的内容。
只有在对 ColorSpace 和 /Decode 条目进行一些假设的情况下,这才会起作用。
如果您计划 creating/modifying 个 PDF 图像,您应该使用一个真正的 PDF 库,它将使用给定的过滤器创建一个真正的图像流。
其核心是寻求有关存储在 "JPEG file" 和 b) 中的 a) 数据内容之间差异的信息存储在嵌入 PDF 文件的 /Filter /DCTDecode
流对象中的数据内容。需要提及的一些方面是:
JPEG 文件
首先,更仔细地了解什么是 "JPEG file" 会有所帮助。事实证明,它的定义并不像人们预期的那样清晰:
"JPEG files" 的文件扩展名有一些变化,因为 .jpg
/.jpeg
都是常用的,更重要的是它们的文件格式是 JPEG/Exif
or JPEG/JFIF
.尽管这两种格式提供了一些不同的方式来将 JPEG 编码图像数据存储在文件中,但它们非常相似,因为它们都依赖于底层 JPEG Interchange Format
。
JPEG Interchange Format
中的数据组织方式是通过使用两个字节 0xFF<XX>
标记,例如:
0xFF 0xD8
图像开始 (SOI) 标记0xFF 0xD9
图片结束 (EOI) 标记0xFF 0xC4
定义霍夫曼 Table (DHT) 标记0xFF 0xDB
定义量化 Table (DQT) 标记0xFF 0xDA
扫描开始 (SOS) 标记0xFF 0xC0
帧开始 (SOF 0) 标记- 等...
JPEG/Exif
和 JPEG/JFIF
都保留了这些标记,并补充了一个 App0
应用程序标记 0xFF 0xE0
段,它提供了一些额外的(但不是绝对必要的)信息。
/Filter /DCTDecode
正如另一个答案中已经提到的那样,至少:
The DCTDecode filter decodes grayscale or color image data that has been encoded in the JPEG baseline format.[.....] The JPEG filter implementation in Acrobat products does not support features of the JPEG standard that are irrelevant to images. In addition, certain choices have been made regarding reserved marker codes and other optional features of the standard. For details, see Adobe Technical Note #5116, Supporting the DCT Filters in PostScript Level 2.
暗示存储在 PDF /Filter /DCTDecode
流中的数据是 JPEG Interchange Format
,这意味着它不需要 JPEG/Exif
或 [=] 的额外标记14=]。
然而,考虑到通过标记提供 DCTDecode prefixed/marked 所需的相应信息的机制,它可以包含 JPEG/Exif
、JPEG/JFIF
甚至 JPEG/Adobe
的 APP0 制造商的数据流,而不妨碍它被正确解释。实际上,应该有可能在流数据中、标记段之间浪费了 space,或者在引入注释部分的 0xFF 0xFE
等标记中浪费了 space,不需要解码图像数据。
** Baseline/Progressive/Special **
JPEG Interchange Format,如前所述,它构成了数据如何存储在 "JPEG files" 和 pdf 的 /Filter /DCTDecode
流对象中的基础,它提供了不同类型的图像编码。
为了获得最佳兼容性,PDF 查看器可能只支持 "baseline" 编码。
底部line/Summary
有使用0xFF XX
标记的JIF(JPEG交换格式),它构成了JPEG文件格式的基础,也是/Filter /DCTDecode
所要求的格式。为了获得最佳兼容性(例如 PDF 1.4 及更早版本),仅支持 "baseline" 的 JIF 编码图像数据部分,在这种情况下,JPEG 文件的内容很可能在直接插入时正确显示pdf 的 /Filter /DCTDecode
流,假定应忽略任何 APP0 标记或其他标记。