使用 xelatex(只需要将图像转换为 pdf!)

使用 xelatex(只需要将图像转换为 pdf!)

这是我第一次担心包含艺术内容的文档草稿的图片是否能正确呈现。我使用下面的基本宏来嵌入图片。图片采用 .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文档声称这不应该起作用。

请注意,上面给出的“集成”仅是概念验证,不应将其用于生产目的。首先,应该为颜色配置文件设置一些“缓存”机制,以避免多次嵌入配置文件。其次,如果同一文件应与不同的配置文件一起使用(如本例所示),这可能会与内部缓存机制发生冲突,因为内部缓存机制只会嵌入每个图像一次。请注意使用./文件名前缀的技巧,使同一文件显示为两个不同的文件。

结论

通过这一轮测试,我得出结论

  1. 使用嵌入的颜色配置文件将图像转换为 PDF 是可行的,但我无法convert通过 ImageMagick (版本 6.7.7-10) 使用它。因此,Linux 上可用的工具数量似乎有限(链接的文章提到了 Scribus,但我没有尝试)。
  2. 在由 Destructably 生成的 PDF 中嵌入 ICC 配置文件pdftex是可行的,但 Ubuntu 上的 Acrobat Reader(版本 9.5.5)似乎无法解释这种嵌入的配置文件,而 Acrobat Professional 则没有问题。此外,这只会向整个 PDF 文档添加“全局”配置文件,无法区分不同的图像。
  3. 使用colorspace关键字\pdfximage,可以将颜色配置文件附加到任何嵌入的图像。
  4. 总体而言,第三种选择似乎是最好的解决方案,因为它也可以与 Linux 上的 Acrobat Reader 一起使用,每个图像都可以有自己的配置文件,并且不需要用于转换图像的罕见工具。

答案2

看来 PDF 格式中仅包含图像包含 ICC 配置文件是不够的,但该配置文件必须作为独立对象包含,并且图像必须引用该对象。

pdftex我认为在(但仅限于 jpeg 图像,根据手册)和中对该功能有低级别的支持luatex,但是该graphicx软件包并不支持此功能。

更加用户友好(至少对我来说 :))可以icc使用luateximg库来包含配置文件。我创建了一个小型库,名为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.jpgrgb.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

我还发现了一个很棒的工具img2pdfnix-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:

相关内容