我使用 TeXlive 2016 和 LuaTeX。我的 TeX 文档包含图像,必须是 8 位扁平灰度(无透明度)或 1 位单色,采用 PNG 格式。我擅长使用图形程序,并能正确准备具有适当模型和分辨率的图像,使用 Magick 完成mogrify -strip
并使用 进行验证identify -verbose
。
显然\includegraphics
知道如何根据像素和分辨率以 100% 比例调整图像大小。我猜它读取了元数据。现在我要问的是:(\includegraphics
或 LuaLaTeX 中的其他命令,而不是 shell)能否给出图像是灰度还是单色的“是”或“否”答案?图像始终是 PNG。
我担心的是,可能会意外包含未处理的图像(例如,在 rgba 模型中,仅使用灰色阴影)。我不希望 TeX 以任何方式转换或操作图像。我只想检查它。如果不是扁平灰色或单色,那么我会向日志中写入警告消息。然后我就会知道我错误地包含了错误类型的图像。
可能吗,不需要大量的代码?我有 PDF 规范,但阅读它并不适合业余爱好者。
我的问题比看上去的要广泛得多。任何准备用于黑白按需打印的 PDF 的人都会遇到类似的问题。我意识到 PDF 中的图像不是 PNG;但这就是它们输入 TeX 的方式。
编辑:在查看了下面 David 的回复后,我更详细地研究了图像格式。JPG 也有类似的情况,但我将重点介绍 PNG。
PNG 规范要求IHDR
在文件开头有一个块。字符串后面的第十个字节IHDR
是图像颜色模型的代码。没有 alpha 通道的灰度(或单色)图像00
在此处有十六进制代码。因此,如果 Lua 能够直接读取图像文件字节,它应该能够扫描 IHDR、数到十并报告字节。
显然这不是 Lua 所做的img.colorspace
,因为nil
无论我输入什么 PNG 图像(灰色、彩色),它总是返回结果。要么img.colorspace
不是我期望的,要么它尝试但未能获得正确的代码。
答案1
\includegraphics
(latex 宏) 基本上对图像一无所知。在传统 tex 中,tex 根本看不到图像文件。
然而,在 Luatex 中,您可以img
使用 lua 库,它包含以下图像信息字段
field name type description
attr string the image attributes for LuaTEX
bbox table table with 4 boundingbox dimensions llx, lly, urx and ury over-
ruling the pagebox entry
colordepth number the number of bits used by the color space
colorspace number the color space object number
depth number the image depth for LuaTEX
filename string the image file name
filepath string the full (expanded) file name of the image
height number the image height for LuaTEX
imagetype string one of pdf, png, jpg, jp2 or jbig2
index number the pdf image name suffix
objnum number the pdf image object number
page number the identifier for the requested image page
pagebox string the requested bounding box, one of none, media, crop, bleed, trim,
art
pages number the total number of available pages
rotation number the image rotation from included pdf file, in multiples of 90 deg.
stream string the raw stream data for an /Xobject /Form object
transform number the image transform, integer number 0..7
width number the image width for LuaTEX
xres number the horizontal natural image resolution (in dpi)
xsize number the natural image width
yres number the vertical natural image resolution (in dpi)
ysize number the natural image height
visiblefileame string when set, this name will find its way in the pdf file as PTEX specifi-
cation; when an empty string is assigned nothing is written to file;
otherwise the natural filename is taken
这可能(也许)有您需要的信息,但 latex 目前没有通过 latex 图形宏提供该接口,您需要进入 Lua 代码。
该示例为每个图像加上了其单色状态的标题
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{c1.png}
monochrome:
\directlua{
img1=img.scan{filename="c1.png"}
tex.print(tostring(img1.colordepth==1))
}
\includegraphics{m1.png}
monochrome:
\directlua{
img2=img.scan{filename="m1.png"}
tex.print(tostring(img2.colordepth==1))
}
\end{document}