这一周花了三天时间,才将论文中的图像生成不失真的PDF图片(我以为的),我的判断标准是将图像放大或者缩小足够倍数后依然清晰可见,以MNIST数据库中的图像为例,方法如下:
- 选择 “文件——导出设置”
- 选择“渲染——自定义渲染器——分辨率选择最高600”,然后点击“确定”
- 选择“导出”,文件类型选择 “emf”
- 打开Visio,将生成的test.emf文件复制到Visio中(快键键Ctrl C和Ctrl V),然后选择另存为到桌面,生成文件类型为PDF。重点在于生成PDF这一步。
点击“选项”,未选择“符合 ISO 19005-1 标准(PDF/A)(1)” ,时,生成PDF的情况如下所示:
原图方法1000%倍时
生成的PDF图放大1000%倍时:
然后选择“符合 ISO 19005-1 标准(PDF/A)(1)” ,时,生成PDF的情况如下所示:
这看起来和原图保持一致,实现了不失真。
所以总结为一句话:
使用MATLAB生成".emf"文件复制到Visio,生成PDF文件时,在“选项”中,将“符合 ISO 19005-1 标准(PDF/A)(1)” 打钩即可。
提示:如果希望Visio生成的PDF文件无白边,可参考如下博客:
用Visio画图,保存为pdf,只保存图部分,不含多余空白区域,
这个只适用于使用Visio画图的情况,如果从MATLAB导出的图片本身就有白边,Visio是处理不了的,这时,你可以借助于其他的手段,我从网上找到几篇博客作为参考:
[Matlab]去除绘图周围空白边界 - 简书
[Matlab]去除subplot子图周围空白边界 - 简书
不知道什么原因,上面两篇文章如此之好竟然处于审核状态,前两天还好好的,既然如此,我就索性将代码复制如下:Expand_axis_fill_figure函数
%输入参数:要去除空白边界的那个绘图所对应的坐标句柄axis_handle
%输出参数:无
%保存为m文件,保存路径与主调函数在同一文件夹
function [ ] = Expand_axis_fill_figure( axis_handle ) %函数定义
% TightInset的位置
inset_vectior = get(axis_handle, 'TightInset');
inset_x = inset_vectior(1);
inset_y = inset_vectior(2);
inset_w = inset_vectior(3);
inset_h = inset_vectior(4);
% OuterPosition的位置
outer_vector = get(axis_handle, 'OuterPosition');
pos_new_x = outer_vector(1) + inset_x; % 将Position的原点移到到TightInset的原点
pos_new_y = outer_vector(2) + inset_y;
pos_new_w = outer_vector(3) - inset_w - inset_x; % 重设Position的宽
pos_new_h = outer_vector(4) - inset_h - inset_y; % 重设Position的高
% 重设Position
set(axis_handle, 'Position', [pos_new_x, pos_new_y, pos_new_w, pos_new_h]);
%函数结束
在MATLAB中可以直接调用这个.m文件,用法如下:
h1=figure(1);
h1_axis = gca;
..... % 你要显示的图片代码部分
Expand_axis_fill_figure(h1_axis)
% 完事后添加这一句代码即可,我觉得这句不要与axis square语句使用,避免部分图像被切掉
通过调用这个Expand_axis_fill_figure函数,基本可以实现图片无白边,但不能保证完全没有,这与你图片的形状有关,而且这个函数不适用于使用subplot绘制多个子图的情况,比较适合plot绘制曲线的情况。