如何导出不模糊的EPS图像?

16

我正在使用Matlab以eps格式导出一张图片,但它使得图片变得模糊。Matlab使用其他格式(如png)不会使图像变模糊。我想知道如何在eps格式下导出一个非模糊的图像。这是使用png格式导出的结果: 输入图像描述

这是使用eps格式导出的结果: 输入图像描述

10个回答

11

更新:

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

预览截图

enter image description here

GSview截图

enter image description here

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

特别是在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

a.png

b.eps

b.eps

可能这是你的EPS查看器引起的问题...


1
@SibbsGambling:我主要是Windows用户,当时Mac部分的答案是由Yoda编辑的(如果我没记错的话,他已经更改了帐户为r.m.)... 我想他的意思是将PDF和EPS文件默认关联到GSView打开,而不是OSX中的默认查看器(显然会进行某种抗锯齿处理,这就解释了图像看起来模糊的原因)。与其他OSX应用程序(如Preview、Keynote等)不同,GSView似乎有自己的渲染引擎,显然不使用系统提供的引擎(Quartz)。 - Amro
我明白了,非常感谢。我只在Distiller中找到了Ghostscript选项。这是正确的位置吗?如果是正确的位置,那么很奇怪,因为我已经勾选了Ghostscript并取消勾选了Apple Distiller,但.eps文件仍然模糊不清。 - Sibbs Gambling
@Amro 你用什么系统打开这些文件的?我想我需要在VirtualBox中安装Ubuntu Linux和GSview,只为了在OS X El Capitan中预览.eps文件。 - Léo Léopold Hertz 준영
1
@Masi 实际上我使用的是Windows,在那里我使用GSViewSumatraPDFEvince中的任一一个来打开PostScript文件(它们也可以处理PDF)。它们都没有显示任何模糊。也许你可以在OSX上安装Evince(我认为它在homebrew和fink中都有可用版本)。顺便说一句,回答中与mac相关的部分不是我提供的 :) - Amro
1
@Masi,你试过最初建议的GSView Mac版本吗(它使用ghostscript作为后端)? - Amro
显示剩余3条评论

5

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

eps2eps oldfile newfile

对我来说(在Mac OS上),这很好用。

1
对我来说,在 Mac OS X 上也能正常工作。(所有其他尝试都失败了。) - Piotr Migdal
你的 psutils 版本是多少?这里报告说它与 1.23 不兼容。https://dev59.com/cGw15IYBdhLWcg3wbbRx#35793889 - Léo Léopold Hertz 준영

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

无论如何,我的解决办法是使用pcolorshading flat代替imagesc。当你将其导出为eps格式时,它会正确地保留图像。例如:

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

enter image description here

注意:你可能会在每个小正方形的反对角线上看到一些细微的白色线条(这取决于操作系统和查看器)。这些是用于呈现图像的图形图元的边缘。然而,这并不是MATLAB导出的缺陷,而是EPS / PDF查看器中呈现的问题。例如,在我Mac上的预览默认设置中,这些线条会显示出来,而在Adobe Reader 9.4的默认设置下,它们不会出现。


这个完美运行!使用LaTeX的epstopdf转换时不会出现淡白色线条。非常感谢! - Jean-Paul

2

如果还有人对解决方法感兴趣:使用文本编辑器打开.eps文件,搜索“interpolate”。你可能会发现“/Interpolate true def”出现了两到三次。将“true”替换为“false”,就可以愉快地使用了 :)


1
这个可行吗?我以为Mac上的pdfkit不支持Interpolate选项?另外,在我生成的Matlab EPS文件中,我找不到插值线。你能详细说明一下应该在哪里插入吗? - robince
我在我的eps文件中没有找到任何插值。 - codekitty
/Interpolate true 是 PDF 而不是 EPS。 - arcticmac

1

我也长期与这个问题斗争。到目前为止,GSView是我发现的唯一一个可以正确显示Matlab(R2015b)生成的eps图像的查看器。eps2eps对我没有用(psutils 1.23)。以下方法最终适用于我:

  1. 按照此处的说明将图像导出为pdf
  2. 使用pdf2ps file.pdf file.eps命令转换文件格式

请不要使用saveas。在Matlab 2016a中,它非常容易出现错误。相比之下,命令export_fig更加健壮 https://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig - Léo Léopold Hertz 준영

1
关于Yoda的回答:在Mac OS X的预览中,您可以通过取消选中“抗锯齿文本和屏幕艺术”来消除每个正方形上的细白色对角线。当然,缺点是任何文本(例如图形轴等)都不会被反锯齿处理。不幸的是,如果您使用imagesc,则取消选中该选项对模糊度没有影响。
另一个注意事项是,如果您使用预览从eps创建pdf,则打开Acrobat时生成的pdf仍然正确显示(非模糊)。

非常有趣的通知!您如何在预览设置中取消选择“抗锯齿文本和屏幕艺术”?我在El Capitan中找不到它。您是否有任何图片展示白色对角线的外观?我非常想看看它们的外观。我在这里开了一个新的帖子,关于您的说法:http://apple.stackexchange.com/q/231745/15504 - Léo Léopold Hertz 준영

0

这个页面对我帮助很大: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

我明白了。

enter image description here


0

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

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

模糊只影响每个块边缘的像素。使用DCT压缩(有时在EPS文件中使用)时,8x8块最佳,可以避免不良伪影。


0
我刚刚写了一个简单的替代 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');

请描述一下你的代码在做什么?最好附上示例输出。 - Léo Léopold Hertz 준영

0

OpenGL渲染器应用于图形

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

1
你应该更多地描述为什么这样可以工作。或者这一切意味着什么。 - pippin1289
1
这仅能工作是因为将渲染器更改为 opengl,保存为类光栅的 EPS 而不是真正的矢量图形。 - Suever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接