EPS格式的图像导出在Matlab中不可见

3
我有一个相当复杂的图形,想要将其导出为EPS格式。这个图像包含使用imagesc创建的图像。当我将其保存为PNG文件时,一切看起来都很好;然而,当将其导出为EPS时,除了图像以外的所有内容都被正确导出。
以下是正确的输出(使用.png): Correct Output in png 而.eps格式的输出如下所示: Wrong Output 这里是.fig文件链接:https://github.com/Rafnuss/BSGS/raw/master/result/0-Illutstration/Illustration_Neighbour-general_2015-11-05_15-42-04.fig 我尝试使用export_fig FEX命令export_fig test.eps,它也给了我同样的结果
我使用的是Ubuntu上的Matlab 2015b版本。

我可以使用R2015b在OS X上复制这个问题。我以前遇到过这种错误。您可能需要保存/导出为PDF格式(也可能在图形的文件菜单下使用“导出设置...”)。 - horchler
1
使用 FEX export_fig - Ander Biguri
@AnderBiguri,我试过了...对我没用。你试过吗? - Rafnuss
@horchler,是的,这可能是计划B选项,但我想用.eps来完成它。 - Rafnuss
你如何尝试并失败了?“我尝试了...对我不起作用”没有任何信息。 - Ander Biguri
@AnderBiguri,抱歉,我的意思是,它给了我与我在上面发布的帖子中相同的数字(没有imagesc图)。eps文件链接。我也在帖子中添加了这些信息。 - Rafnuss
1个回答

1
我知道这是对这个问题的迟到回复,但我想提供一个解释,以防将来有人遇到此问题。
基本问题在于EPS文件不支持透明度(这就是为什么export_fig没有产生不同结果的原因)。MATLAB意识到了这一点,因此当你尝试使用透明度打印图形时,它会尽力重新创建你屏幕上的图像。不幸的是,它也失败了。
所以让我们举一个非常简单的例子。我们将创建一个红色的surf并使每个元素具有不同的Alpha值。
% Surface with random transparency between 0 (transparent) and 1 (opaque)
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', rand(10), 'FaceAlpha', 'flat'); 

现在让我们保存PNG和EPS版本并查看它们。

enter image description here enter image description here

不错,对吧?PNG和EPS版本之间的透明度似乎得到了保留。这大多是正确的,除非我们将表面定义为完全透明的区域。在这些区域中,MATLAB实际上用纯色红色替换了这些区域。更简单地说,在PNG中完全为白色的区域在EPS中完全为红色。
为了进一步说明这一点,让我们创建一个表面,其中AlphaData0(完全透明)或0.1(大部分透明)。
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', eye(10)/10, 'FaceAlpha', 'flat');

enter image description here enter image description here

好的,现在我们可以看到,如果我们将某些东西定义为完全透明,MATLAB甚至不会尝试使其透明。它做的恰恰相反。另一方面,半透明区域似乎仍然是半透明的。它们实际上是透明的吗?

为了确定这里是否真的有透明度,请回到第一个示例。让我们尝试将axes颜色更改为黑色,以便我们可以看到它是否真的是透明的。

set(gca, 'Color', 'k')

并且保存为PNG和EPS格式后的结果

enter image description here enter image description here

很有趣...那么这里到底发生了什么呢?就像我之前说的,MATLAB 知道 EPS 无法包含透明信息。它也知道你的图形包含透明度,并希望以某种方式包含此信息。它所做的是使用预期背景颜色(白色)抖动您的颜色,以创建透明的外观。不幸的是,如果您在透明对象下方有任何不是白色的东西,您将看不到它,因为最终更透明的区域只是更白而并非实际上更透明

对于这样可变透明度的数据,这是一个相当大的问题,真正的解决方法只能将其保存为支持透明度的格式,或者您可以在 EPS 编辑器中打开生成的 EPS 文件,在那里更改情节对象的透明度,然后重新导出为不同的格式。

另一方面,如果您没有具有可变透明度的情节对象,而是具有不透明透明区域的对象,则有一个解决方法。

你可以将透明面的FaceColor设置为NaN。这将导致特定面甚至不被渲染,当打印文件时MATLAB会忽略该面。
% Make everything but the diagonal be NaN (transparent)
cdata = ones(10);
cdata(~eye(10)) = NaN;

% Create a surface with no transparency and just CData with NaN values
surf(zeros(10), 'FaceColor', 'flat', 'CData', cdata);

% Change axes color to check transparency
set(gca, 'Color', 'k')

enter image description here enter image description here

现在PNG和EPS都能够成功地显示有色的axes,这意味着对角线以外的所有内容在PNG和EPS中都是功能透明的。无论只是一个axes还是其他绘图对象,都可以实现这一点。
现在,回到您发布的问题。不幸的是,您的图片链接已经失效,但如果您打开创建的EPS文件,很可能会看到图像位于黄绿表面下方,只是表面使用了透明度,MATLAB强制使透明区域不透明,并用白色抖动。然后,当您查看生成的EPS文件时,这个实心表面覆盖了下面的图像,使它看起来好像消失了。如果将透明表面元素的CData值更改为NaN,则可以在这些位置通过表面看到图像。

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