图像导出在eps中不可见

时间:2015-11-16 16:35:03

标签: matlab matlab-figure

我有一个非常复杂的数字,我想以EPS的形式出口。此图包含使用imagesc创建的图像。当我将其保存为PNG文件时,一切看起来都很好;但是,当导出为EPS时,除图像之外的所有内容都将正确导出。

这是正确的输出:(使用.png)

Correct Output in png

和.eps:

Wrong Output

Here是.fig文件。

我使用命令export_fig尝试了export_fig test.eps FEX,它还给了我same result

我在Ubuntu上使用Matlab 2015b。

1 个答案:

答案 0 :(得分: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实际上将 solid 红色替换为这些区域。更简单地说,在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文件,您可能会看到图像 位于黄色/绿色表面下方,它是' s只是表面使用透明度和MATLAB强制透明区域不透明,而是用白色抖动。当您查看生成的EPS文件时,这个坚固的表面会覆盖下面的图像,使其看起来好像消失了。如果您将透明曲面元素更改为CDataNaN,则您可以在这些位置通过曲面查看图像。