eps 中的图像导出在 Matlab 中不可见
Image export in eps not visible in Matlab
我有一个非常复杂的图形,我想将其导出为 EPS。此图包含使用 imagesc
创建的图像。当我将它保存为 PNG 文件时,一切看起来都很好;但是,当导出为 EPS 时,除了图像之外的所有内容都可以正确导出。
这是正确的输出:(使用 .png)
还有 .eps 一个:
Here 是 .fig 文件。
我使用命令 export_fig test.eps
尝试了 export_fig
FEX,它也给了我 same result
我在 Ubuntu 上使用 Matlab 2015b。
我知道这是对这个问题的迟到回复,但我想我会解释发生的事情,以防将来有人遇到这个问题。
这里的基本问题是 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 红色代替了这些区域。更简单地说,在 PNG 中完全是白色的区域,它们在 EPS 中是完全红色的。
为了进一步证明这一点,让我们创建一个表面,其中 AlphaData
是 0
(完全透明)或 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 和每股收益。无论它只是下面的 axes
还是还有其他绘图对象,这都有效。
现在,回到您发布的问题。不幸的是,您的图像链接不再有效,但如果您打开创建的 EPS 文件,您可能会看到图像 是 在 yellow/green 表面下方,只是表面使用了透明度,而 MATLAB 强制透明区域不透明,而是用白色抖动。当您查看生成的 EPS 文件时,这个固体表面会覆盖下面的图像,使它看起来好像消失了。如果您将透明表面元素更改为具有 NaN
的 CData
值,您将能够在这些位置通过表面看到图像。
我有一个非常复杂的图形,我想将其导出为 EPS。此图包含使用 imagesc
创建的图像。当我将它保存为 PNG 文件时,一切看起来都很好;但是,当导出为 EPS 时,除了图像之外的所有内容都可以正确导出。
这是正确的输出:(使用 .png)
还有 .eps 一个:
Here 是 .fig 文件。
我使用命令 export_fig test.eps
尝试了 export_fig
FEX,它也给了我 same result
我在 Ubuntu 上使用 Matlab 2015b。
我知道这是对这个问题的迟到回复,但我想我会解释发生的事情,以防将来有人遇到这个问题。
这里的基本问题是 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 红色代替了这些区域。更简单地说,在 PNG 中完全是白色的区域,它们在 EPS 中是完全红色的。
为了进一步证明这一点,让我们创建一个表面,其中 AlphaData
是 0
(完全透明)或 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 和每股收益。无论它只是下面的 axes
还是还有其他绘图对象,这都有效。
现在,回到您发布的问题。不幸的是,您的图像链接不再有效,但如果您打开创建的 EPS 文件,您可能会看到图像 是 在 yellow/green 表面下方,只是表面使用了透明度,而 MATLAB 强制透明区域不透明,而是用白色抖动。当您查看生成的 EPS 文件时,这个固体表面会覆盖下面的图像,使它看起来好像消失了。如果您将透明表面元素更改为具有 NaN
的 CData
值,您将能够在这些位置通过表面看到图像。