我有一个情节,我将背景设置为透明:
set(gcf, 'Color', 'None');
set(gca, 'Color', 'None');
当我尝试保存图像(来自观看者)时,我保存为.png,但它保存为白色背景。如何以透明背景保存?
由于
答案 0 :(得分:10)
令人失望但是,MATLAB的默认saveas
和print
命令无法很好地处理透明事物。您必须以某种背景保存它,然后通过imread
/ imwrite
或其他工具进行转换。
有些工具可能会有所帮助:
我更喜欢矢量图形,因此在需要透明度时使用svg exports。如果您确实有位图,请使用imwrite(bitmapData, 'a.png', 'png', 'transparency', backgroundColor)
。
答案 1 :(得分:2)
所以我仍然想要一些简单的东西,不需要我安装任何其他东西(公司电脑不允许:/)。我偶然发现this link,说:
您需要做的就是以下
1)在matlab文件中添加命令以使用透明背景格式化图形
var fixedPoint = $('.pinned-isi').offset().top
$(window).resize(function(){
fixedPoint = $('.pinned-isi').offset().top
});
$('.full-wrapper').scroll(function(){
if ($('.page-isi').offset().top - 50 >= fixedPoint){
$('.pinned-isi').show();
} else {
$('.pinned-isi').hide();
}
});
并保存或导出以eps格式生成的数字。 (比如Bspline.eps)
2)在NotePad中打开Bspline.eps
3)看第一行。例如 set(gcf, 'color', 'none');
set(gca, 'color', 'none');
。最后一个数字3.0表示Postscript级别。对于级别3,搜索字符串%!PS-Adobe-3.0 EPSF-3.0
。您可以在这一行中找到(四个数字后跟rf
)
0 0 3025 2593 rf%使用%注释该行。
(对于第2级搜索字符串rf
而不是pr
)
保存文件。
现在您可以使用eps文件,也可以将其转换为pdf然后再使用它。 无论如何它将具有透明背景
<强>附加强>
对于我来说,虽然我只有rf
之后才有re
和两行。但结果是%!PS-Adobe-3.0 EPSF-3.0
现在透明了。
答案 2 :(得分:1)
自MATLAB 2014b发布以来,情况发生了变化。新实现的图形系统(所谓的HG2,Handle Graphics版本2)在透明度方面做得更好。
现在它至少可以正确地为SVG保存透明度!
答案 3 :(得分:0)
作为对Memming回答的补充。带有 exportgraphics
的 Matlab 2020 支持透明背景,但仅适用于矢量化输出(不适用于呈现的内容)。要导出具有透明度的渲染数据,您仍然无法将其保存为透明。但是,您可以通过保存具有两种不同背景颜色(例如白色和黑色)的渲染数据,然后加载两个临时图像,求解一个简单的方程系统,从而检索透明度和原始颜色数据,然后将所有这些数据保存到RGBA png 文件。
关键是要认识到,Matlab 保存的渲染输出是透明度乘以图像数据+(1 - 透明度)乘以背景颜色。从单个输出中,无法恢复图像数据和透明度,但可以从具有不同背景颜色的两个输出中恢复。如果 Matlab 在渲染输出中支持透明背景颜色会更容易,但这种方式也有效。
示例脚本:
% create example data
g = -10:0.1:10;
[x, y, z] = ndgrid(g, g, g);
v = (x.^2 + y.^2 - 10).^2 + (z.^2 - 5).^2;
% render in 3D with transparency
fig = figure();
% one surface fully opaque
fv = isosurface(x, y, z, v, 20);
p = patch(fv, 'FaceColor', [1, 0, 0], 'FaceAlpha', 1, 'EdgeColor', 'none');
% another surface with transparency
fv = isosurface(x, y, z, v, 80);
p = patch(fv, 'FaceColor', [0, 1, 1], 'FaceAlpha', 0.5, 'EdgeColor', 'none');
fig.Children.Color = 'none'; % transparent background of figure axis
view([40 40]);
pbaspect([1,1,1]);
camlight;
lighting('gouraud');
% save figure in different ways
% save as vector format, doesn't produce nice output see for example https://stackoverflow.com/questions/61631063
exportgraphics(fig, 'test.pdf', 'ContentType', 'vector', 'BackGroundColor', 'none');
% prints warning: Warning: Vectorized content might take a long time to create,
% or it might contain unexpected results. Set 'ContentType' to 'image' for better performance.
% save as rendered output with transparent background not work
exportgraphics(fig, 'test.png', 'ContentType', 'image', 'BackGroundColor', 'none');
% prints warning: Warning: Background transparency is not supported; using white instead.
% now our solution, export with two background colors
exportgraphics(fig, 'test1.png', 'ContentType', 'image', 'BackgroundColor', 'k'); % black background
exportgraphics(fig, 'test2.png', 'ContentType', 'image', 'BackgroundColor', 'w'); % white background
% load exported images back in and scale to [0,1]
u = imread('test1.png');
u = double(u) / 255;
v = imread('test2.png');
v = double(v) / 255;
% recover transparency as a
a = 1 - v + u;
a = mean(a, 3);
a = max(0, min(1, a));
m = a > eps;
% recover rgb
c = zeros(size(u));
for i = 1 : 3
ui = u(:, :, i);
ci = c(:, :, i);
ci(m) = ui(m) ./ a(m);
c(:, :, i) = ci;
end
c = max(0, min(1, c));
% store again
imwrite(uint8(c*255), 'test.transparent.png', 'Alpha', a);
% temporary files test1.png and test2.png can now be deleted
这是生成的透明图像。要查看,请保存图像并使用合适的查看器查看。
最后一条评论:对于高质量的生产数字,您可能希望关闭(将 Visible 属性设置为关闭)所有具有透明度的渲染部件并将轴和标签保存为矢量化输出,然后反转可见性,即关闭所有轴和标签,仅显示具有透明度的渲染部分并使用两种不同的背景颜色保存它们,然后重建透明度并覆盖两者,矢量化轴和标签以及具有透明度的渲染部分并将它们组合起来。从 Matlab 2020b 开始,Matlab 无法单独执行此操作。