将 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 值发生了变化,并且底层黑色在颜色像素周围显示为灰色边框。

我尝试了几种方法。最简单的,实际上对我有用的是使用带有选项 externalimagestikz 终端,它将创建的图像 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)