将 eps 图像转换为 pdf 时如何避免灰色轮廓伪影?
How to avoid gray outline artefacts when converting an eps image to pdf?
为了生成带有 LaTeX 标签的矢量图形,我使用 gnuplot 和 cairolatex 终端,通过 plot "data.txt" u 1:2:3 matrix with image notitle
创建图像,然后:
latex figuregen.tex
dvips -E -ofile.eps figuregen
# Correct the bounding box automatically:
epstool --copy --bbox file.eps filename.eps
## Create a pdf:
ps2pdf -dPDFSETTINGS=/prepress -dSubsetFonts=true -dEmbedAllFonts=true -dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dEPSCrop filename.eps filename.pdf
这是原始 eps 图片特定区域的放大图:
白色区域实际上对应于数据文件中的 NaN 值。
现在使用eps转换成的pdf文件:
在 pdf 版本中,现在所有 NaN 像素周围都有不需要的轮廓,在图像的较高部分产生了非常多的噪点。
我想将这些图像作为 pdf 格式,没有人工制品,并保留高质量的 LaTeX 标签。我怀疑可能有一个 ps2pdf
选项来停用这种不需要的行为,但我就是找不到它。
我尝试了 -dGraphicsAlphaBits=1
、-dNOINTERPOLATE
、-dALLOWPSTRANSPARENCY
、-dNOTRANSPARENCY
、-dCompatibilityLevel=1.4
或 -dCompatibilityLevel=1.5
,但没有成功.
我也尝试直接在 gnuplot
中解决这个问题,但没有成功(参见下面的示例)。
你们中有人知道如何解决这个问题吗?
非常感谢您的宝贵时间!
编辑
更令人惊讶和有问题的是,这些人工制品在印刷时也会出现。
但是请注意,当仅绘制数据集的一小部分时,它们不会出现在极端缩放级别。
MWE:
# plot.plt
set size ratio -1
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
#set yr [300:0] ### no artefacts if zoom is higher than 1310% in evince
set yr [400:100] ### no artefacts if zoom is higher than 1780% in evince
#set yr [450:0] ### artefacts at all zoom levels if we show more data, or all of it
set term cairolatex dashed color; set output "temp.tex"
plot "data.txt" u 1:2:3 matrix with image notitle
set output #Closes the temporary output file.
!sed -e 's|/Title|%/Title|' -e 's|/Subject|%/Subject|' -e 's|/Creator|%/Creator|' -e 's|/Author|%/Author|' < temp.tex > graph.tex
并且,为了完整起见:
% figuregen.tex
\documentclass[dvips]{article}
\pagestyle{empty}
\usepackage[dvips]{graphicx} %
\begin{document}
\input graph.tex
\end{document}
如果需要,部分数据可以在这里以文本形式找到;足以重现问题:https://paste.nomagic.uk/?e0343cc8f759040a#DkRxNiNrH6d3QMZ985CxhA21pG2HpVEShrfjg84uvAdt
编辑 2
事实上,使用 set terminal cairolatex pdf
时会出现同样的人工制品问题
set terminal cairolatex standalone pdf size 16cm,10.5cm dashed transparent
set output "plot.tex"
直接用pdflatex
gnuplot<plot.plt
pdflatex plot.tex
(注意,这是使用 Gnuplot 版本 5.2 补丁级别 6)。
实际问题是,NaN 值设置为透明黑色像素 (#00000000
)。
透明度会导致这些灰色轮廓伪影,具体取决于缩放级别。如果放大得足够近,则看不到伪影。
但是一旦图像像素小于您的显示器像素,这些值就会被插值用于屏幕显示。似乎像 evince(我也测试了 okular 和 mupdf)这样的 pdf 查看器同时插值了颜色和 alpha 通道,因此 Nan 像素的 alpha 值发生了变化,并且底层黑色在颜色像素周围显示为灰色边框。
我尝试了几种方法。最简单的,实际上对我有用的是使用带有选项 externalimages
的 tikz
终端,它将创建的图像 with image
保存为单独的 png 文件。
这些 png 文件还包含透明度,并且最终结果具有相同的伪像。
但是您可以使用 imagemagick 的 convert
将 png 的透明 NaN 像素更改为白色
convert temp.001.png -alpha off -fill white -opaque black temp.001.png
所以,一个完整的工作绘图文件是
# plot.plt
set size ratio -1
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
set ytics 100
set yrange reverse
set term tikz standalone externalimages background "white"; set output "temp.tex"
plot "data.txt" u 1:2:3 matrix with image notitle
# temp.001.png is the external image which contains only the 'with image' part
# We must remove the #00000000 color, which represents the NaN pixels
# I couldn't replace the colors directly, but I could first remove the alpha channel
# and then change black to white, because no other black pixel appear
!convert temp.001.png -alpha off -fill white -opaque black temp.001.png
set output #Closes the temporary output file.
!sed -e 's|/Title|%/Title|' -e 's|/Subject|%/Subject|' -e 's|/Creator|%/Creator|' -e 's|/Author|%/Author|' < temp.tex > graph.tex
!pdflatex graph.tex
graph.pdf:
的 Mupdf 屏幕截图
请注意,我使用 standalone
可以直接编译生成的文件,以便我可以检查结果。
一个更麻烦的选择是“手动”绘制 with image
到一个 png 文件,并将其包含在第二个图中,就像我在 Big data surface plots: Call gnuplot from tikz to generate bitmap and include automatically? 中描述的那样然后你可以对png 是如何生成的。
仅作记录,with image pixels
似乎在做“把戏”,将创建一个没有 NaN
数据点周围灰色的文件。使用 gnuplot 5.2.6 测试。
plot FILE u 1:2:3 matrix with image pixels notitle
代码:
### avoid shading around NaN datapoints
reset session
set size ratio -1
FILE = "data.txt"
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
set term cairolatex dashed color
set output "temp.tex"
plot FILE u 1:2:3 matrix with image pixels notitle
set output
### end of code
结果:(截图的PNG,因为我好像不能在这里添加PDF)
为了生成带有 LaTeX 标签的矢量图形,我使用 gnuplot 和 cairolatex 终端,通过 plot "data.txt" u 1:2:3 matrix with image notitle
创建图像,然后:
latex figuregen.tex
dvips -E -ofile.eps figuregen
# Correct the bounding box automatically:
epstool --copy --bbox file.eps filename.eps
## Create a pdf:
ps2pdf -dPDFSETTINGS=/prepress -dSubsetFonts=true -dEmbedAllFonts=true -dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dEPSCrop filename.eps filename.pdf
这是原始 eps 图片特定区域的放大图:
现在使用eps转换成的pdf文件:
我想将这些图像作为 pdf 格式,没有人工制品,并保留高质量的 LaTeX 标签。我怀疑可能有一个 ps2pdf
选项来停用这种不需要的行为,但我就是找不到它。
我尝试了 -dGraphicsAlphaBits=1
、-dNOINTERPOLATE
、-dALLOWPSTRANSPARENCY
、-dNOTRANSPARENCY
、-dCompatibilityLevel=1.4
或 -dCompatibilityLevel=1.5
,但没有成功.
我也尝试直接在 gnuplot
中解决这个问题,但没有成功(参见下面的示例)。
你们中有人知道如何解决这个问题吗?
非常感谢您的宝贵时间!
编辑
更令人惊讶和有问题的是,这些人工制品在印刷时也会出现。
但是请注意,当仅绘制数据集的一小部分时,它们不会出现在极端缩放级别。
MWE:
# plot.plt
set size ratio -1
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
#set yr [300:0] ### no artefacts if zoom is higher than 1310% in evince
set yr [400:100] ### no artefacts if zoom is higher than 1780% in evince
#set yr [450:0] ### artefacts at all zoom levels if we show more data, or all of it
set term cairolatex dashed color; set output "temp.tex"
plot "data.txt" u 1:2:3 matrix with image notitle
set output #Closes the temporary output file.
!sed -e 's|/Title|%/Title|' -e 's|/Subject|%/Subject|' -e 's|/Creator|%/Creator|' -e 's|/Author|%/Author|' < temp.tex > graph.tex
并且,为了完整起见:
% figuregen.tex
\documentclass[dvips]{article}
\pagestyle{empty}
\usepackage[dvips]{graphicx} %
\begin{document}
\input graph.tex
\end{document}
如果需要,部分数据可以在这里以文本形式找到;足以重现问题:https://paste.nomagic.uk/?e0343cc8f759040a#DkRxNiNrH6d3QMZ985CxhA21pG2HpVEShrfjg84uvAdt
编辑 2
事实上,使用 set terminal cairolatex pdf
set terminal cairolatex standalone pdf size 16cm,10.5cm dashed transparent
set output "plot.tex"
直接用pdflatex
gnuplot<plot.plt
pdflatex plot.tex
(注意,这是使用 Gnuplot 版本 5.2 补丁级别 6)。
实际问题是,NaN 值设置为透明黑色像素 (#00000000
)。
透明度会导致这些灰色轮廓伪影,具体取决于缩放级别。如果放大得足够近,则看不到伪影。
但是一旦图像像素小于您的显示器像素,这些值就会被插值用于屏幕显示。似乎像 evince(我也测试了 okular 和 mupdf)这样的 pdf 查看器同时插值了颜色和 alpha 通道,因此 Nan 像素的 alpha 值发生了变化,并且底层黑色在颜色像素周围显示为灰色边框。
我尝试了几种方法。最简单的,实际上对我有用的是使用带有选项 externalimages
的 tikz
终端,它将创建的图像 with image
保存为单独的 png 文件。
这些 png 文件还包含透明度,并且最终结果具有相同的伪像。
但是您可以使用 imagemagick 的 convert
将 png 的透明 NaN 像素更改为白色
convert temp.001.png -alpha off -fill white -opaque black temp.001.png
所以,一个完整的工作绘图文件是
# plot.plt
set size ratio -1
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
set ytics 100
set yrange reverse
set term tikz standalone externalimages background "white"; set output "temp.tex"
plot "data.txt" u 1:2:3 matrix with image notitle
# temp.001.png is the external image which contains only the 'with image' part
# We must remove the #00000000 color, which represents the NaN pixels
# I couldn't replace the colors directly, but I could first remove the alpha channel
# and then change black to white, because no other black pixel appear
!convert temp.001.png -alpha off -fill white -opaque black temp.001.png
set output #Closes the temporary output file.
!sed -e 's|/Title|%/Title|' -e 's|/Subject|%/Subject|' -e 's|/Creator|%/Creator|' -e 's|/Author|%/Author|' < temp.tex > graph.tex
!pdflatex graph.tex
graph.pdf:
的 Mupdf 屏幕截图请注意,我使用 standalone
可以直接编译生成的文件,以便我可以检查结果。
一个更麻烦的选择是“手动”绘制 with image
到一个 png 文件,并将其包含在第二个图中,就像我在 Big data surface plots: Call gnuplot from tikz to generate bitmap and include automatically? 中描述的那样然后你可以对png 是如何生成的。
仅作记录,with image pixels
似乎在做“把戏”,将创建一个没有 NaN
数据点周围灰色的文件。使用 gnuplot 5.2.6 测试。
plot FILE u 1:2:3 matrix with image pixels notitle
代码:
### avoid shading around NaN datapoints
reset session
set size ratio -1
FILE = "data.txt"
set palette defined ( 0 '#D73027', 1 '#F46D43', 2 '#FDAE61', 3 '#FEE090', 4 '#FFFFD9', 5 '#E0F3F8', 6 '#ABD9E9', 7 '#74ADD1', 8 '#4575B4' )
set term cairolatex dashed color
set output "temp.tex"
plot FILE u 1:2:3 matrix with image pixels notitle
set output
### end of code
结果:(截图的PNG,因为我好像不能在这里添加PDF)