【问题标题】:Image export in eps not visible in Matlabeps中的图像导出在Matlab中不可见
【发布时间】:2016-02-17 20:06:26
【问题描述】:

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

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

还有一个 .eps 文件:

Here 是 .fig 文件。

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

我在 Ubuntu 上使用 Matlab 2015b。

【问题讨论】:

  • 我可以使用 R2015b 在 OS X 上复制它。我以前也遇到过这种bug。您可能需要保存/导出为 PDF(也可能使用图的文件菜单下的导出设置...)。
  • 使用 FEX export_fig
  • @AnderBiguri,我试过了......对我不起作用。你试过了吗?
  • @horchler,是的,这可能是 B 计划选项,但我想用 .eps 来实现
  • 您是如何尝试并失败的? “我试过了……对我不起作用”给出的信息为零。

标签: matlab matlab-figure


【解决方案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 版本并检查它们。

还不错吧?看起来在 PNG 和 EPS 版本之间保留了透明度。这几乎是正确的,除非我们将表面定义为完全透明。在这些区域中,MATLAB 实际上用 solid red 代替了这些区域。更简单地说,在 PNG 中完全是白色的区域中,它们在 EPS 中是完全红色的。

为了进一步证明这一点,让我们创建一个表面,其中AlphaData0(完全透明)或0.1(大部分透明)。

surf(zeros(10), 'FaceColor', 'r', 'AlphaData', eye(10)/10, 'FaceAlpha', 'flat');

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

要确定这里是否真的存在透明度,让我们先回到第一个示例。让我们尝试将axes 颜色更改为黑色,这样我们就可以看到它是否真的是透明的。

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

以及保存为 PNG 和 EPS 时的结果

这很有趣……那么这里到底发生了什么。正如我之前所说,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')

现在 PNG 和 EPS 都能够成功地在下方显示彩色 axes,这意味着对角线之外的所有内容在 PNG 和 EPS 中都是功能透明的。无论是下面的 axes 还是还有其他绘图对象,这都有效。

现在,回到您发布的问题。不幸的是,您的图像的链接不再有效,但如果您打开创建的 EPS 文件,您可能会看到图像 在黄色/绿色表面下方,这只是表面使用透明度和 MATLAB 强制透明区域不透明,而是用白色抖动。当您查看生成的 EPS 文件时,该实体表面会覆盖下方的图像,使其看起来好像消失了。如果您将透明表面元素更改为具有CDataNaN,那么您将能够通过这些位置的表面看到图像。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多