这是我第一次担心包含艺术内容的文档草稿的图片是否能正确呈现。我使用下面的基本宏来嵌入图片。图片采用 .jpg 格式,并嵌入了 ICC 配置文件。一旦进入目标 pdf,图片就会明显比原生显示的颜色更暗。我进行了各种实验来确定问题的根源,并得出结论:
无论使用什么软件(多个导航器、Gimp、预览等),都可以一致地看到原生图片
从各种 pdf 查看器、导航器等查看时,目标 pdf 的显示效果也一致。我想知道是什么原因造成了这种情况。在编译之前将所有图片转换为其他格式是否有帮助?如果有,那要转换哪一种格式?
\newcommand{\SinglePicture}[3]{% \begin{figure}[#1] \centering \includegraphics[width=\textwidth]{#2}\caption*{#3} \end{figure} }
答案1
免责声明:我对色彩管理几乎一无所知,但发现这个主题很有趣。下面的一些内容让我感到困惑。也许有知识的人可以解释一下……
通过谷歌搜索,我找到了有关此问题的两条建议。
更新:基于米哈尔-h21建议pdftex
支持向嵌入图像添加颜色配置文件,我可以想出另一个解决方案。请参阅将颜色配置文件附加到嵌入图像以下。
转换为 PDF
看http://webstaff.itn.liu.se/~karlu20/div/howto/LaTeX_colour_management.php
其中的建议基本上是将图像(包括配置文件)转换为 PDF 并嵌入 PDF。
为了测试,我下载了示例带有 ProPhoto 配置文件的图像。
identify -verbose butterfly_ProPhoto.png
给出
Profile-icc: 566 bytes
Description: SCARSE: Kodak ProPhoto RGB
Manufacturer: SCARSE: Kodak ProPhoto RGB
Model: SCARSE: Kodak ProPhoto RGB
Copyright: Copyright (C) 1999-2005 Scarse Project
因此 ImageMagick 显然找到了配置文件。然后我用 转换了图像convert butterfly_ProPhoto.png butterfly_ProPhoto.pdf
。从文档中可以看出 ImageMagick 可以处理颜色配置文件,并identify -verbose butterfly_ProPhoto.pdf
给出
Profile-icc: 2576 bytes
Description: Artifex Software sRGB ICC Profile
Manufacturer: Artifex Software sRGB ICC Profile
Model: Artifex Software sRGB ICC Profile
Copyright: Copyright Artifex Software 2011
因此显然 PDF 包含一个配置文件,但它已被转换(为什么?)。
测试配置文件嵌入
\documentclass[a4paper]{article}
\usepackage{graphicx}
\begin{document}
\noindent
\includegraphics[width=\linewidth]{butterfly_ProPhoto.png}
\noindent
\includegraphics[width=\linewidth]{butterfly_ProPhoto.pdf}
\end{document}
使用 Acrobat Reader 查看时,我没有发现任何区别:
此外,我的屏幕上的结果看起来与链接页面上给出的示例 PDF,所以显然我仅仅使用 convert 就做错了。
进一步的暗示convert
并不能消除它来自此示例包含具有 GBR 配置文件的图像。
转换Peppers_withGBRprofile.jpg
为 PDF 并在 crobat reader 中查看,如上所示
顺便说一句,Acrobat Professional 中显示的内容相同。
因此,显然确实无法使用convert
成功将配置的图像转换为 PDF 以便嵌入pdftex
,尽管 ImageMagic 文档和identify
结果似乎表明并非如此。有人可以详细说明吗?
第二次尝试:使用 Acrobat Professional 转换为 PDF
由于尝试使用 ImageMagick 转换为 PDF 完全没有成功,我感到很失望,于是我尝试使用 Acrobat professional 的“创建 PDF”功能以相同的方式将测试图像(PNG 和 JPG)转换为 PDF,结果如下:
因此,我可以得出结论,将带有配置文件的图像转换为 PDF 确实可行,但对于我在 Ubuntu Linux 系统上使用的基于 ImageMagick 的工具链则不行。
我在开头链接的页面提到,在 Linux 下唯一能够做到这一点的工具是抄写员我还没有尝试过。
在 PDF 中嵌入颜色配置文件
看http://compgroups.net/comp.text.tex/making-a-cmyk-pdf/153995
该建议基本上是在 PDF 中嵌入颜色配置文件。
因此,以上面的 GBR 示例为例,我使用以下方法提取了 ICC 配置文件
convert Peppers_withGBRprofile.jpg gbr.icm
并使用以下测试文件将配置文件嵌入到 PDF 中:
\documentclass[a4paper]{article}
\usepackage{graphicx}
\immediate\pdfobj stream attr{/N 4} file{gbr.icm}
\pdfcatalog{%
/OutputIntents [ <<
/Type /OutputIntent
/S/GTS_PDFA1
/DestOutputProfile \the\pdflastobj\space 0 R
/OutputConditionIdentifier (Adobe GBR (2004))
/Info(Adobe GBR (2004))
>> ]
}
\begin{document}
\noindent
\includegraphics[width=\linewidth]{Peppers_withGBRprofile.jpg}
\noindent
\includegraphics[width=\linewidth]{Peppers_withGBRprofile.pdf}
\end{document}
令人沮丧的是,使用 Ubuntu 上的 Acrobat Reader,PDF 显示的内容完全错误地如下:
但在 Acrobat Professional 中,我得到了正确的显示:
因此,看起来在 PDF 中嵌入颜色配置文件确实有效(对 JPG 和 PDF 包含都有效),但在 Linux 上的 Acrobat Reader 中则无效。
此外,这种“解决方案”意味着嵌入的配置文件只是成为整个文档的基础配置文件,因此一个配置文件将应用于所有图像(本身不包含配置文件)。因此,嵌入两个测试图像(两者都包含不同的配置文件),结果是
在颜色校样对话框中,您还可以看到 GBR 配置文件显示为文档配置文件。这是该建议不太有用的另一个方面,因为我可以在 Acrobat 对话框中直接指定任何其他配置文件(相应地更改两个图像的颜色显示)。
将颜色配置文件附加到嵌入图像
根据米哈尔-h21在他的回答中,我查看了pdftex
文档并发现原语确实支持将相应对象与嵌入图像相关联的\pdfximage
关键字。colorspace
基于此,我可以对该包pdftex
的驱动程序进行以下修补graphics
(包括示例):
\documentclass[a4paper]{article}
\usepackage{graphicx}
\usepackage{etoolbox}
\makeatletter
\let\GPT@colorspacefile\ltx@empty
\define@key{Gin}{colorspacefile}{\def\GPT@colorspacefile{#1}}%
\patchcmd\Gread@@pdftex
{\pdfximage\GPT@RuleAttr}
{%
\ifx\GPT@colorspacefile\ltx@empty
\else
\immediate\pdfobj stream attr{/N 4} file{\GPT@colorspacefile}%
\@tempcnta\the\pdflastobj
\fi
\pdfximage\GPT@RuleAttr
\ifx\GPT@colorspacefile\ltx@empty
\else
colorspace \@tempcnta
\fi
}%
{}{}
\makeatother
\begin{document}
\noindent
\includegraphics[width=.5\linewidth]{Peppers_withGBRprofile.jpg}\includegraphics[width=.5\linewidth,colorspacefile={gbr.icm}]{./Peppers_withGBRprofile.jpg}
\noindent
\includegraphics[width=.5\linewidth]{butterfly_ProPhoto.png}\includegraphics[width=.5\linewidth,colorspacefile={prophoto.icm}]{./butterfly_ProPhoto.png}
\end{document}
这使
我直接从图片中获取了个人资料
convert Peppers_withGBRprofile.jpg gbr.icm
convert butterfly_ProPhoto.png prophoto.icm
对我来说,这似乎是最好的解决方案,因为它允许将每个图像与其自己的颜色配置文件相关联,而无需进行非平凡的转换步骤。
有趣的是,您可以在测试图像上看到它也适用于 PNG 图像,尽管pdftex
文档声称这不应该起作用。
请注意,上面给出的“集成”仅是概念验证,不应将其用于生产目的。首先,应该为颜色配置文件设置一些“缓存”机制,以避免多次嵌入配置文件。其次,如果同一文件应与不同的配置文件一起使用(如本例所示),这可能会与内部缓存机制发生冲突,因为内部缓存机制只会嵌入每个图像一次。请注意使用./
文件名前缀的技巧,使同一文件显示为两个不同的文件。
结论
通过这一轮测试,我得出结论
- 使用嵌入的颜色配置文件将图像转换为 PDF 是可行的,但我无法
convert
通过 ImageMagick (版本 6.7.7-10) 使用它。因此,Linux 上可用的工具数量似乎有限(链接的文章提到了 Scribus,但我没有尝试)。 - 在由 Destructably 生成的 PDF 中嵌入 ICC 配置文件
pdftex
是可行的,但 Ubuntu 上的 Acrobat Reader(版本 9.5.5)似乎无法解释这种嵌入的配置文件,而 Acrobat Professional 则没有问题。此外,这只会向整个 PDF 文档添加“全局”配置文件,无法区分不同的图像。 - 使用
colorspace
关键字\pdfximage
,可以将颜色配置文件附加到任何嵌入的图像。 - 总体而言,第三种选择似乎是最好的解决方案,因为它也可以与 Linux 上的 Acrobat Reader 一起使用,每个图像都可以有自己的配置文件,并且不需要用于转换图像的罕见工具。
答案2
看来 PDF 格式中仅包含图像包含 ICC 配置文件是不够的,但该配置文件必须作为独立对象包含,并且图像必须引用该对象。
pdftex
我认为在(但仅限于 jpeg 图像,根据手册)和中对该功能有低级别的支持luatex
,但是该graphicx
软件包并不支持此功能。
更加用户友好(至少对我来说 :))可以icc
使用luatex
的img
库来包含配置文件。我创建了一个小型库,名为collorspaces.lua
:
local m = {}
local colorspaces = {}
local images = {}
function create_profile(filename)
local icc = pdf.immediateobj("streamfile", filename, [[
/N 3
/Alternate/DeviceRGB]])
local profile = pdf.immediateobj("[/ICCBased "..icc.." 0 R]")
return profile
end
function load_image(filename, attributes)
local exists =images[filename]
if exists then return exists end
local profile_file = filename:gsub("[%w]+$","icm")
local command = "convert ".. filename .." " .. profile_file
local conversion_status = os.execute(command)
local profile = nil
local img_attr = {filename = filename}
if conversion_status == 0 then
local icc_file = io.open(profile_file,"r")
local icc = icc_file:read("*all")
icc_file:close()
local hash = md5.sumhexa(icc)
profile = colorspaces[hash]
if not profile then
profile = create_profile(profile_file)
end
img_attr.colorspace= profile
colorspaces[hash]=profile
end
local image = img.scan(img_attr)
images[filename] = image
return image
end
local function write_image(image)
return img.write(image)
end
local function include_image(image_name)
local image = load_image(image_name)
write_image(image)
end
--load_image("gbr.jpg")
--load_image("rgb.jpg")
m.load_image = load_image
m.write_image = write_image
m.include_image = include_image
return m
主要功能是load_image
,其中icc
使用 imagemagick 实用程序提取配置文件convert
,然后计算此文件的哈希值,以防止将相同的配置文件多次包含在 pdf 文件中,如果尚未使用该配置文件,则使用create_profile
函数将其包含在内。然后加载图像。还有两个函数,write_image
将图像输出到输出流,以及include_image
加载和写入图像。
现在有一些示例文档:
\documentclass{article}
\usepackage[]{graphicx}
\pdfcompresslevel=0
\directlua{%
cs = require "colorspaces"
}
\def\myinc#1{\mbox{\directlua{cs.include_image "#1"}}}
\begin{document}
\setlength\parindent{0pt}
Rgb file without profile\\
\myinc{rgb.jpg}
Rgb file with profile\\
\myinc{gbr.jpg}
Rgb file with profile and includegraphics\\
\includegraphics{gbr.jpg}
Resize image\\
\resizebox{\linewidth}{!}{\myinc{gbr.jpg}}
\end{document}
你必须用
lualatex -shell-escape filename
否则convert
命令无法运行!
有两张图片,gbr.jpg
和rgb.jpg
,这些是 Stephan 样品中的辣椒。第一张包含 ICC 配置文件,第二张不包含。结果:
如您所见,前两幅图像略有不同,它们是使用我们的函数包含的,而第三幅图像的使用则\includegraphics
完全错误。最后一个例子显示了如何调整图像大小。
如果您不想使用lualatex
,您可以pdf
使用此脚本将您的图像转换为imgtopdf.lua
:
#!/usr/bin/env texlua
local filename = arg[1]
if not filename then
print "Usage imgtopdf filename"
return false
end
local jobname = filename:gsub("%.%w+$","")
local tpl = [[\documentclass{standalone}
\directlua{cs = require "colorspaces"}
\def\myinc#1{\directlua{cs.include_image "#1"}}
\begin{document}
\myinc{%s}
\end{document}
]]
local lualatex = io.popen("lualatex -shell-escape -jobname="..jobname,"w")
lualatex:write(string.format(tpl,filename))
lualatex:close()
运行
texlua imgtopdf.lua imagename
答案3
我最近也遇到了这个问题,并找到了两个简单的解决方法(我用过这个文件为了我的测试——我找不到原始的辣椒图片——;摩托车没有轮廓时是蓝色的,有轮廓时是绿色的)。
第一个原因是我之前用过 XeLaTeX,它实际上就是为此而生的。因此,一个解决方案可能是将文件转换为 PDF,并xelatex
编译以下代码:
\documentclass{standalone}
\usepackage{graphicx}
\begin{document}
\includegraphics{file.jpg}
\end{document}
然后,将生成的 PDF 包含到您的 LuaLaTeX/pdfLaTeX 文档中,它就可以正常工作了。
我发现的第二个解决方案是在克里塔,然后在 下Image > Convert Image Colour Space…
。然后选择sRGB
作为目标配置文件,并保存文件(不包括颜色配置文件)。现在它应该可以在不遵守嵌入配置文件的应用程序中正确显示。
答案4
使用 xelatex(只需要将图像转换为 pdf!)
我实际上并没有直接意识到Archange的伟大答案,那就是对我来说,此线程中唯一可行的解决方案:首先使用xelatex
(不是 lualatex 也不是 pdflatex)通过独立包和简单的 includegraphics 生成 pdf 文件,然后包含该 pdf 文件。因为在许多图片上运行可能很繁琐,所以这里有一个脚本可以自动执行此操作并缓存文件(需要-shell-escape
,如果您不想使用,请阅读 robust-externalize 的文档-shell-escape
)。如果您的 CTAN 不是最新的,您可能需要复制 robust-externalize 的 .sty 文件。
图像(如果启用了色彩管理则为蓝色,否则为红色/绿色):
\documentclass{article}
\usepackage{graphicx}
\usepackage{robust-externalize}
\robExtConfigure{
enable fallback to manual mode,
new preset={icc image xelatex}{
latex,
add to preamble={\usepackage{graphicx}},
use xelatex,
},
}
\NewDocumentCommand{\includegraphicsICC}{D<>{}O{}m}{%
\cacheMe[
icc image xelatex,
add to includegraphics options={#2},
dependenciesList={#3},
#1
]{\includegraphics{__ROBEXT_WAY_BACK__#3}}
}
\begin{document}
Compare:
\includegraphics[width=5cm]{should_be_blue.jpg}
With:
\includegraphicsICC[width=5cm]{should_be_blue.jpg}
\end{document}
% Local Variables:
% TeX-command-extra-options: "--shell-escape -halt-on-error"
% End:
使用 img2pdf
我还发现了一个很棒的工具img2pdf(nix-shell -p img2pdf
如果您使用 nix)它也会做类似的事情:img2pdf yourimage.jpg -o yourimage.pdf
将生成一个您可以包含的 pdf:
\documentclass{article}
\usepackage{graphicx}
\usepackage{robust-externalize}
\robExtConfigure{
enable fallback to manual mode,
new preset={img2pdf}{
set compilation command={img2pdf "__ROBEXT_WAY_BACK____IMG_SOURCE_FILE__" -o "__ROBEXT_OUTPUT_PDF__"},
set template={},
command if no externalization/.code={%
\robExtDisableTikzpictureOverwrite\evalPlaceholder{\includegraphics[__ROBEXT_INCLUDEGRAPHICS_OPTIONS__]{__IMG_SOURCE_FILE__}}%
}%
},
}
\NewDocumentCommand{\includegraphicsICC}{D<>{}O{}m}{%
\cacheMe[
img2pdf,
set includegraphics options={#2},
dependenciesList={#3},
set placeholder={__IMG_SOURCE_FILE__}{#3},
#1
]{}
}
\begin{document}
Compare:
\includegraphics[width=5cm]{should_be_blue.jpg}
With:
\includegraphicsICC[width=5cm]{should_be_blue.jpg}
\end{document}
% Local Variables:
% TeX-command-extra-options: "--shell-escape -halt-on-error"
% End: