如何导出不模糊的 eps 图片?

Posted

技术标签:

【中文标题】如何导出不模糊的 eps 图片?【英文标题】:How to export non-blurry eps images? 【发布时间】:2011-09-30 15:34:24 【问题描述】:

我在 Matlab 中使用 eps 格式导出图像,但它会使图像变得平滑。 Matlab 不会使用 png 等其他格式对图像进行模糊处理。我想知道如何以 eps 格式导出非模糊图像。这是使用 png 生成的图像:

这是使用 eps 生成的图像:

【问题讨论】:

【参考方案1】:

更新:

问题在 Mac 上可重现,问题出在 eps 渲染器而不是 MATLAB。例如,保存 imagesc(rand(20)) 并使用 Preview 和 GSview 查看会导致以下结果:

预览截图

GSview 截图

显然,信息并没有丢失。它只是没有被一些 EPS 查看器正确解释/读取。解决方案很简单:使用 GSview 查看您的eps 图像。可以从here下载

尤其是在 Mac 上,如果您的最终应用程序是 latex/pdflatex,则必须明确将其设置为使用 GS/GSview,否则,它将默认使用嵌入操作系统的 Quartz 引擎。


以前的答案:

我无法重现您描述的行为。这是我使用的代码,在 WinXP 32 位上使用 R2010b 进行测试:

M = fspecial('gaussian',[20 20],5);
imagesc(M)
print('-dpng','a.png')
print('-depsc2','b.eps')

a.png

b.eps

也许这是您的 EPS 查看器的问题...

【讨论】:

很好的答案,但你能解释一下如何用explicitly set it to use GS/GSview 换成LaTeX 吗?我尝试谷歌搜索,但没有找到这样做的方法。谢谢! @SibbsGambling:我主要是 Windows 用户,答案的 Mac 部分当时由 yoda 编辑(如果我没记错的话,他已经将帐户更改为 r.m.)。 ..我猜他的意思是将PDF和EPS文件默认与GSView相关联,而不是OSX中的默认查看器(这显然做了某种抗锯齿,解释了看起来模糊的图像)。与其他 OSX 应用程序(Preview、Keynote、..)不同,GSView 似乎有自己的渲染引擎,显然没有使用系统提供的渲染引擎(Quartz)。 我明白了。非常感谢。我只在Distiller 中找到了Ghostscript 选项。这是正确的地方吗?如果是对的地方,那就很奇怪了,因为我已经勾选了Ghostscript 并取消了Apple Distiller,但是.eps仍然是模糊的。 @Masi 实际上我在 Windows 上使用 GSView、SumatraPDF 或 Evince 中的任何一个来打开 PostScript 文件(它们也处理 PDF)。它们都没有显示出任何模糊性。也许您可以在 OSX 上安装 Evince(我认为它在 homebrew 和 fink 中都可用)。顺便说一句,答案的 mac 部分不是我 :) @Masi 您是否按照最初的建议尝试了 GSView 的 mac 版本(它使用 ghostscript 作为后端)?【参考方案2】:

不确定它为什么会起作用,但您可以尝试执行以下操作:

eps2eps oldfile newfile

对我有用(在 mac os 上)

【讨论】:

对我来说,它在 Mac OS X 上也能正常工作。(所有其他方法都失败了。) 您的 psutils 的版本是多少?在这里报告不适用于 1.23 ***.com/a/35793889/54964【参考方案3】:

起初我以为你做错了什么,但后来我想起这是一个问题,大约一年前困扰我。我想不出一种方法来“修复”这种行为,根据我的研究,这很可能是一个错误,其他几个人也遇到了这个问题,并且没有已知的解决方案。当然,我对最后一部分的看法可能是错误的,并且自从我寻找它们以来可能已经出现了一些解决方案。

无论如何,我的解决方法是使用pcolorshading flat 而不是imagesc。当您将其导出为 eps 格式时,它会正确保留图像。示例:

pcolor(rand(20));
shading flat
print('-depsc','figure.eps')

注意:可能看到沿每个小方块的对角线出现的细而微弱的白线(取决于操作系统和查看器)。这些是用于渲染图像的图形基元的边缘。但是,这不是 MATLAB 导出中的缺陷,而是在您的 EPS/PDF 查看器中呈现的错误。例如,在我的 Mac 上使用 Preview 中的默认设置时,这些行会显示出来,而在 Adob​​e Reader 9.4 中使用默认设置时,它们不会出现。

【讨论】:

这很完美!使用 LaTeX 的 epstopdf 转换时不会出现微弱的白线。非常感谢!【参考方案4】:

如果有人仍然对解决方法感兴趣:使用文本编辑器打开 .eps 文件并搜索“interpolate”。您可能会发现“/Interpolate true def”两到三遍。把“真”换成“假”,开心就好:)

【讨论】:

这行得通吗?我认为 Mac 上的 pdfkit 不尊重 Interpolate 选项?此外,在我的 matlab 生成的 EPS 中,我没有找到插值线。你能详细说明一下应该插入的位置吗? 我没有在我的 eps 中找到任何插值 /Interpolate true 是 PDF 而不是 EPS。【参考方案5】:

关于 Yoda 回答的说明:在 Mac OS X 中的 Preview 中,您可以通过取消选中“Anti-alias text and screen art”使每个正方形上的细白色对角线消失。当然,缺点是任何文本(例如图形轴等)都没有抗锯齿。不幸的是,如果您使用的是 imagesc,则取消选中它对模糊度没有影响。

另一个注意事项是,如果您使用预览从 eps 制作 pdf,当您在 Acrobat 中打开它时,生成的 pdf 仍会正确显示(不模糊)。

【讨论】:

非常有趣的通知!如何取消选中预览设置中的消除锯齿文本和屏幕艺术?我在 El Capitan 找不到它。你有什么图片白色的对角线是什么样子的吗?我很想看看他们的样子。我在 apple.stackexchange.com/q/231745/15504【参考方案6】:

我也一直在努力解决这个问题。到目前为止,GSView 是我发现的唯一能正确显示 Matlab (R2015b) 生成的 eps 数据的查看器。 eps2eps 对我不起作用(psutils 1.23)。 以下最终对我有用:

    按照here的说明将图形导出为pdf pdf2ps 文件.pdf 文件.eps

【讨论】:

请不要使用saveas。在 Matlab 2016a 中它非常有问题。命令export_fig 更加健壮mathworks.com/matlabcentral/fileexchange/23629-export-fig【参考方案7】:

我刚刚为imagesc 编写了这个简单的直接替换。除了最基本的功能外,它不支持所有功能,但我仍然希望它有所帮助。

function h = imagesc4pdf(C)

[ny nx] = size(C);

px = bsxfun(@plus, [-0.5; 0.5; 0.5; -0.5], reshape(1:nx, [1 1 nx]));
py = bsxfun(@plus, [-0.5; -0.5; 0.5; 0.5], 1:ny);

n = numel(C);
px = reshape(repmat(px, [1 ny 1]), 4, n);
py = reshape(repmat(py, [1 1 nx]), 4, n);

h = patch(px, py, reshape(C,1,n), 'linestyle', 'none');

xlim([.5 nx+.5]);
ylim([.5 ny+.5]);
set(gca, 'ydir', 'reverse');

【讨论】:

你能描述一下你的代码在做什么吗?示例输出也很棒。【参考方案8】:

应用 opengl 渲染器到图

figure(gcf);
set(gcf,'renderer','opengl');

【讨论】:

您应该更多地描述为什么这样做。或者这一切意味着什么。 这只是有效的,因为通过将渲染器更改为opengl,它会将其保存为光栅 EPS,而不是真正的矢量图形。【参考方案9】:

模糊实际上取决于您的查看器应用程序或打印机使用的渲染软件。为了始终获得良好的效果,请将图像中的每个像素设置为 8x8 相同颜色的像素块,即像这样调整图像大小:

im2 = imresize(im1, 8, 'nearest');

然后,模糊只会影响每个块边缘的像素。 8x8 块是最好的,因为它们使用 DCT 压缩(有时在 eps 文件中使用)进行压缩,没有令人讨厌的伪影。

【讨论】:

【参考方案10】:

这个页面对我帮助很大:http://tech.mof-mof.co.jp/blog/machine-learning-octave.html(用日文写的,请用谷歌翻译)

这也很有帮助:Octave-Gnuplot-AquaTerm error: set terminal aqua enhanced title "Figure 1"...unknown terminal type"

我也在https://www.coursera.org/learn/machine-learning/discussions/weeks/2/threads/Dh-aRfqSEeaHSQ6l4xnh6g回复了。

我像这样重新安装了 gnuplot:

$ brew cask install xquartz
$ brew cask install aquaterm
$ brew uninstall gnuplot
$ brew install gnuplot --with-aquaterm --with-x11 --with-qt  # you can show other options by `$ brew options gnuplot`

您可以像这样编辑 ~/.octaverc:

setenv("GNUTERM", "qt")

在 octave 窗口中,输入“system gnuplot”后,然后

set pm3d interpolate 2, 2

保存文件后,打开octave-cli.app,输入

imagesc(magic(3)), colorbar

我知道了。

【讨论】:

以上是关于如何导出不模糊的 eps 图片?的主要内容,如果未能解决你的问题,请参考以下文章

LatexPPT画图,导出emf格式,word插入emf文件并导出pdf,pdf裁剪并导出eps文件,latex插入eps文件

depthmap导出图片模糊

pdf文件中截取eps图片并压缩

word另存为pdf图片模糊

LaTex排版操作教程---生成tex标准eps图的技巧

matlab将eps文件转换成位图