如何在 PDF 文件的双色调图像上使用颜色蒙版?
How to use a color Mask on a bitonal image in a PDF file?
我正在尝试创建一个包含单色 1 位图像的 PDF 文件,但将图像配置为在包含白色像素的地方透明(以便图像下方的内容可见)。图片使用DeviceGray
颜色space,BitsPerComponent
为1.
我将 Mask
条目与一个数组一起使用,该数组指定应屏蔽的颜色范围。我的 PDF 规范副本将此称为“颜色键掩码”。由于图像是双色调的,因此此颜色范围仅为 [1 1]
(白色)。
但是,我根本无法让它工作。图像下的内容永远不会显示。我试过调整范围值、更改图像过滤器、调整周围的图形状态——都无济于事。
唯一有效的方法是将图像颜色 space 从 DeviceGray
更改为 DeviceRGB
并相应地调整 Mask
范围,但这会增加这些图像在 PDF 文件中的大小,我做不到。
在双色调 DeviceGray
图像上使用色键遮罩的正确方法是什么?
这是我认为应该有效但无效的图像:
6 0 obj
<<
/Length 8800
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 350
/Height 100
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFF<snip>FFFC
endstream
endobj
编辑: 添加完整示例 PDF 文件以获得完整上下文。该文件包含一个带有文本“XYZ”的图像,以及在 XYZ 图像下运行的一行,该行被图像隐藏但在文本下应该可见:
%PDF-1.4
%צה
1 0 obj
<<
/Type /Catalog
/Version /1.4
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
3 0 obj
<<
/Type /Page
/MediaBox [0.0 0.0 612.0 792.0]
/Parent 2 0 R
/Contents 4 0 R
/Resources 5 0 R
>>
endobj
4 0 obj
<<
/Length 53
>>
stream
0 396 m
612 396 l
S
q
90 0 0 80 261 356 cm
/Im1 Do
Q
endstream
endobj
5 0 obj
<<
/XObject <<
/Im1 6 0 R
>>
>>
endobj
6 0 obj
<<
/Length 1920
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 90
/Height 80
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FE0FFF8307FFF8380000FFC0FF07FF0783FFF0780000FFC0FF87FE0FC3FFF0F80000FFC0FF83FE0FC1FFE0F80000FFC0FFC1FC1FE0FFC1FFFFE0FFC0FFE0F83FF0FFC3FFFFC1FFC0FFF0F87FF07F83FFFF83FFC0FFF0707FF83F07FFFF07FFC0FFF820FFFC3F0FFFFF07FFC0FFFC21FFFC1E0FFFFE0FFFC0FFFC01FFFE1C1FFFFC1FFFC0FFFE03FFFF0C3FFFF83FFFC0FFFF07FFFF003FFFF07FFFC0FFFF07FFFF807FFFF07FFFC0FFFE03FFFFC0FFFFE0FFFFC0FFFC01FFFFC0FFFFC1FFFFC0FFFC21FFFFE1FFFF83FFFFC0FFF820FFFFE1FFFF83FFFFC0FFF0707FFFE1FFFF07FFFFC0FFF0F87FFFE1FFFE0FFFFFC0FFE0F83FFFE1FFFC1FFFFFC0FFC1FC1FFFE1FFFC1FFFFFC0FFC3FE1FFFE1FFF83FFFFFC0FF83FE0FFFE1FFF07FFFFFC0FF07FF07FFE1FFE0FFFFFFC0FE0FFF83FFE1FFE000007FC0FE1FFFC3FFE1FFE000007FC0FC1FFFC1FFE1FFE000007FC0F83FFFE0FFE1FFE000007FC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0
endstream
endobj
xref
0 7
0000000000 65535 f
0000000015 00000 n
0000000078 00000 n
0000000135 00000 n
0000000247 00000 n
0000000352 00000 n
0000000399 00000 n
trailer
<<
/Root 1 0 R
/ID [<DF10D2517650DA8AC34FF5D6B9B046EA> <DF10D2517650DA8AC34FF5D6B9B046EA>]
/Size 7
>>
startxref
2505
%%EOF
编辑 2: 感谢 这确实有效,我深入研究了 reader 的一面。原来是SumatraPDF有bug,我用的旧版AcrobatReader也有bug
更新 Acrobat Reader 后,简化的示例可以使用,但涉及 Forms 的更复杂的示例仍然无法使用 -- 看来这可能是 PDF 规范中未被广泛使用的领域或者像其他人一样经过实战考验,即使在 Acrobat Reader 中也是如此。由于兼容性问题,我可能暂时不会使用 DeviceGray
+ bitonal + Mask
组合,而是使用效率较低的 SMask
选项。
所有示例(简单的和复杂的)在 iOS、Chrome 和 Firefox 查看器中都能正常工作,所以我只是碰巧选择了两个最差的 reader 选项来测试这个。
在没有看到整个文件的情况下,我无法说出为什么没有应用遮罩。
但下面的文件显示 /Mask 应用于 /DeviceGray 双色图像:
4 0 obj
<<
/Type /Page
/Resources <</XObject <</XO0 6 0 R>>>>
/Contents [5 0 R ]
/MediaBox [0 0 612 792 ]
/Parent 3 0 R
>>
endobj
5 0 obj
<<
/Length 103
>>
stream
/DeviceRGB cs
0 1 0 sc
50 650 m 250 650 l 250 750 l 50 750 l h f
q 200 0 0 100 50 650 cm /XO0 Do Q
endstream
endobj
6 0 obj
<<
/Subtype /Image
/Width 16
/Height 8
/BitsPerComponent 1
/ColorSpace /DeviceGray
/Mask [1 1]
/Length 16
>>
stream
UUUUUUUUUUUUUUUU
endstream
endobj
这是结果(绘制在绿色矩形上方的图像,U=01010101,白色 (1) 是透明的):
对于 SumatraPDF,该错误存在于 MuPDF 引擎中,并且由于上述问题已在当前 Pre-Release 中修复。
SumatraPDF Pre-Release 构建版本 3.4.14261+ 2022-Feb-04 或更高版本可从 https://www.sumatrapdfreader.org/prerelease
我正在尝试创建一个包含单色 1 位图像的 PDF 文件,但将图像配置为在包含白色像素的地方透明(以便图像下方的内容可见)。图片使用DeviceGray
颜色space,BitsPerComponent
为1.
我将 Mask
条目与一个数组一起使用,该数组指定应屏蔽的颜色范围。我的 PDF 规范副本将此称为“颜色键掩码”。由于图像是双色调的,因此此颜色范围仅为 [1 1]
(白色)。
但是,我根本无法让它工作。图像下的内容永远不会显示。我试过调整范围值、更改图像过滤器、调整周围的图形状态——都无济于事。
唯一有效的方法是将图像颜色 space 从 DeviceGray
更改为 DeviceRGB
并相应地调整 Mask
范围,但这会增加这些图像在 PDF 文件中的大小,我做不到。
在双色调 DeviceGray
图像上使用色键遮罩的正确方法是什么?
这是我认为应该有效但无效的图像:
6 0 obj
<<
/Length 8800
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 350
/Height 100
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFF<snip>FFFC
endstream
endobj
编辑: 添加完整示例 PDF 文件以获得完整上下文。该文件包含一个带有文本“XYZ”的图像,以及在 XYZ 图像下运行的一行,该行被图像隐藏但在文本下应该可见:
%PDF-1.4
%צה
1 0 obj
<<
/Type /Catalog
/Version /1.4
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
3 0 obj
<<
/Type /Page
/MediaBox [0.0 0.0 612.0 792.0]
/Parent 2 0 R
/Contents 4 0 R
/Resources 5 0 R
>>
endobj
4 0 obj
<<
/Length 53
>>
stream
0 396 m
612 396 l
S
q
90 0 0 80 261 356 cm
/Im1 Do
Q
endstream
endobj
5 0 obj
<<
/XObject <<
/Im1 6 0 R
>>
>>
endobj
6 0 obj
<<
/Length 1920
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 90
/Height 80
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FE0FFF8307FFF8380000FFC0FF07FF0783FFF0780000FFC0FF87FE0FC3FFF0F80000FFC0FF83FE0FC1FFE0F80000FFC0FFC1FC1FE0FFC1FFFFE0FFC0FFE0F83FF0FFC3FFFFC1FFC0FFF0F87FF07F83FFFF83FFC0FFF0707FF83F07FFFF07FFC0FFF820FFFC3F0FFFFF07FFC0FFFC21FFFC1E0FFFFE0FFFC0FFFC01FFFE1C1FFFFC1FFFC0FFFE03FFFF0C3FFFF83FFFC0FFFF07FFFF003FFFF07FFFC0FFFF07FFFF807FFFF07FFFC0FFFE03FFFFC0FFFFE0FFFFC0FFFC01FFFFC0FFFFC1FFFFC0FFFC21FFFFE1FFFF83FFFFC0FFF820FFFFE1FFFF83FFFFC0FFF0707FFFE1FFFF07FFFFC0FFF0F87FFFE1FFFE0FFFFFC0FFE0F83FFFE1FFFC1FFFFFC0FFC1FC1FFFE1FFFC1FFFFFC0FFC3FE1FFFE1FFF83FFFFFC0FF83FE0FFFE1FFF07FFFFFC0FF07FF07FFE1FFE0FFFFFFC0FE0FFF83FFE1FFE000007FC0FE1FFFC3FFE1FFE000007FC0FC1FFFC1FFE1FFE000007FC0F83FFFE0FFE1FFE000007FC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0
endstream
endobj
xref
0 7
0000000000 65535 f
0000000015 00000 n
0000000078 00000 n
0000000135 00000 n
0000000247 00000 n
0000000352 00000 n
0000000399 00000 n
trailer
<<
/Root 1 0 R
/ID [<DF10D2517650DA8AC34FF5D6B9B046EA> <DF10D2517650DA8AC34FF5D6B9B046EA>]
/Size 7
>>
startxref
2505
%%EOF
编辑 2: 感谢
更新 Acrobat Reader 后,简化的示例可以使用,但涉及 Forms 的更复杂的示例仍然无法使用 -- 看来这可能是 PDF 规范中未被广泛使用的领域或者像其他人一样经过实战考验,即使在 Acrobat Reader 中也是如此。由于兼容性问题,我可能暂时不会使用 DeviceGray
+ bitonal + Mask
组合,而是使用效率较低的 SMask
选项。
所有示例(简单的和复杂的)在 iOS、Chrome 和 Firefox 查看器中都能正常工作,所以我只是碰巧选择了两个最差的 reader 选项来测试这个。
在没有看到整个文件的情况下,我无法说出为什么没有应用遮罩。
但下面的文件显示 /Mask 应用于 /DeviceGray 双色图像:
4 0 obj
<<
/Type /Page
/Resources <</XObject <</XO0 6 0 R>>>>
/Contents [5 0 R ]
/MediaBox [0 0 612 792 ]
/Parent 3 0 R
>>
endobj
5 0 obj
<<
/Length 103
>>
stream
/DeviceRGB cs
0 1 0 sc
50 650 m 250 650 l 250 750 l 50 750 l h f
q 200 0 0 100 50 650 cm /XO0 Do Q
endstream
endobj
6 0 obj
<<
/Subtype /Image
/Width 16
/Height 8
/BitsPerComponent 1
/ColorSpace /DeviceGray
/Mask [1 1]
/Length 16
>>
stream
UUUUUUUUUUUUUUUU
endstream
endobj
这是结果(绘制在绿色矩形上方的图像,U=01010101,白色 (1) 是透明的):
对于 SumatraPDF,该错误存在于 MuPDF 引擎中,并且由于上述问题已在当前 Pre-Release 中修复。
SumatraPDF Pre-Release 构建版本 3.4.14261+ 2022-Feb-04 或更高版本可从 https://www.sumatrapdfreader.org/prerelease