Matlab绘图保存为(矢量)EMF格式,但呈现为光栅图。

4

我有一段Matlab代码,可以生成一个子图数组,看起来像这样:

enter image description here

当我将其保存为EMF文件(通常是矢量格式),并在Powerpoint中插入或使用Inkscape查看时,当我对图像进行近距离缩放时,它看起来像素化,并且明显由单个封装对象组成,而不是许多小的图形对象:

enter image description here

这对我来说非常令人惊讶,因为长期以来我一直将Matlab图形导出为EMF并将其集成到PowerPoint幻灯片中,以便在那里构建更复杂的图形,作为矢量图形,可以在任何大小下打印。这些导入的EMF也可以很好地缩放,并且无论我在PowerPoint中缩放多少,都看起来很平滑。
有人能猜到为什么在这种情况下,此图形未保存为矢量图形,而是(似乎)呈现为光栅图吗?产生此图的代码(基于Matlab命令subplot、line和scatter)相当冗长/不优雅,但如果需要找到解决方案,我可以提供详细信息或简化。谢谢!
此站点上其他类似的主题未能帮助解决此问题。

1
如果可能的话,请从混合中删除PowerPoint。在矢量图形编辑程序中打开EMF,以查找它是作为矢量图还是光栅图导出的。如果您想在Dropbox或类似网站上发布EMF的副本并提供链接,我很乐意查看。 - Steve Rindsberg
1
如果我没记错的话,在PPT中你可以在其属性中设置图像分辨率,如果质量有变化就尝试增加它(但我不确定是否与WORD混淆了,因为我已经好几年没用过了)。如果是这样,那么PPT会将你的EMF作为光栅处理,但保持为矢量形式。如果不是,那么它就会将其保留为光栅。另一个选项是EMF可能存在问题,因为微软正在逐步停止使用EMF而不是修复依赖它们的操作系统中的安全漏洞。要检查这一点,请尝试使用不同的格式,如WMF、SVG等。 - Spektre
1
@z8080 元文件是整数(wmf为16位,emf为32位),因此不同分辨率可能会创建舍入/缩放/平滑处理伪影,即使它们是矢量图形。 - Spektre
1
如果你喜欢这句话:“如果它很蠢但能用,那就不是蠢货”,那么你可以使用matlab2tikz包和“standalone”选项将Matlab图形导出为tikz格式,创建一个LaTeX文档,然后编译成.eps或任何你想要的文件类型。包的链接:https://se.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz - Nicky Mattsson
1
@z8080 你尝试过使用 https://github.com/altmany/export_fig 吗? - Paolo
显示剩余4条评论
1个回答

6
我相信我以前遇到过这个问题。如果它与我面临的问题相同,那么它与用于保存图形的渲染器有关。虽然在导出矢量文件时应自动选择painters渲染器,但我曾经遇到过它使用openGL渲染器的情况,这会导致使用位图。我不完全确定为什么会发生这种情况——可能是对于特别复杂的图形,它会恢复到openGL以避免过大或过于复杂的矢量文件。

如果您正在使用print命令,则可以按如下方式强制使用绘图算法:

print('-painters',...)

如果你是使用“文件”>“另存为...”进行保存的话,我认为设置图形的渲染器应该可以解决问题:
set(figure_handle,'renderer','painters');

根据MATLAB文档的解释:

'-opengl' — OpenGL渲染器。在保存位图图像时使用此渲染器。OpenGL即使使用矢量格式也会生成位图图像,这可能会限制您在其他应用程序中编辑图像的程度。

'-painters' — Painters渲染器。在保存矢量图形文件时使用此渲染器。如果您保存到矢量图形文件,并且图形RendererMode属性设置为“auto”,则print自动尝试使用Painters渲染器。如果要确保输出格式是真正的矢量图形文件,则指定Painters渲染器。例如:

print('-painters','-deps','myVectorFile')

如果未指定渲染器,则print会自动使用适当的渲染器来生成所请求的输出格式。但是,如果为图形设置了Renderer属性,则print在生成输出时使用该渲染器。

编辑:另一个选项是使用复制图形命令(编辑>复制图形)-- 这应该将图形复制为EMF文件,并应遵守图形的渲染器设置。


从菜单中保存为EMF格式不会改变输出,如果使用您建议的set命令。 - z8080
1
你使用的Powerpoint版本是什么?我相信在Powerpoint 365和2016中,你可以将图像导入为SVG格式,这样MATLAB应该会将其呈现为矢量图像。或者,你可以打印为SVG格式,然后在Inkscape中打开,并将其导出为EMF文件。 - MrAzzaman
1
@z8080 可尝试的另一个选项是使用"复制图形"命令--我已添加了一个编辑来解释这一点。 - MrAzzaman
1
你可以尝试的一件事是检查复制选项(编辑>复制选项)并将剪贴板格式更改为“元文件”,这应该会强制将其复制为矢量图像。如果这不起作用,那么我建议您尝试我的先前建议,即从Inkscape导出为SVG并另存为EMF文件。 - MrAzzaman
1
我曾经遇到过类似的问题,MATLAB 无法很好地打印 SVG 文件。需要注意的是,有时(根据我的经验),通过“文件”> “另存为...”创建的文件比“打印”产生的文件更高质量。不完全确定它们为什么不同,但确实如此。 - MrAzzaman
显示剩余5条评论

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