本节教程将向您演示如何将GUI的坐标系(axes)上显示的图像、图片和曲线保存为图像文件。
这个功能对GUI的终端用户很helpful,因为我们可以将结果直接保存下来,而不需要频繁的运行程序。很不幸的是,MATLAB没有提供直接的函数或操作,让来来执行这个任务。
自己动手丰衣足食,好,下面演示的实例将让您美梦成真!自由保存GUI坐标系上的图形!
因为本节教程需要您具备一定能够Matlab基本知识和必要GUI经验,故再进行本教程之前,如果您是GUI刚入门菜鸟,建议您先看下:
1、GUI入门指导实例教程 http://www.matlabsky.com/thread-5217-1-1.html
2、handles结构体简介 http://www.matlabsky.com/thread-5223-1-1.html
3、在GUI中实现数据共享和传递
OK,Let’s Begin Now!
1、下载本教程中使用到savePlotWithinGUI.m savePlotWithinGUI.m (1.81 KB, 下载次数: 680)
下面我对本函数大概介绍下,并在代码上给出注释:
代码的原理很简单,就是使用Matlab自带的copyobject函数,将想要保存的坐标系上的图形拷贝到一个新的figure中,然后使用saveas命令保存这个新figure的内容。
当然在拷贝的时候要注意调整新figure的相关属性,比如单位、位置等。
(1)函数具有两个输入参数axesObject和legendObject,其中后者是可选的
(2)axesObject是GUI中坐标系的句柄,legendObject是您使用legend函数创建的图例说明的句柄
- %created by: Quan Quach
- % commented by: dynamic
- %date: 11/8/07
- %function to save plots within a GUI
- function savePlotWithinGUI(axesObject, legendObject)
- % 将GUI坐标系上的图形保存为图像文件
- %
- % 参数说明
- % axesObject 希望被保存的axes对象的句柄 (必须)
- %legendObject 由legend函数创建的图例说明的句柄 (可选)
- %
- % 选择存储路径、文件名以及格式
- [filename, pathname] = uiputfile({ ‘*.emf’,’Enhanced Meta File (*.emf)’;…
- ‘*.bmp’,’Bitmap (*.bmp)’; ‘*.fig’,’Figure (*.fig)’}, …
- ‘Save picture as’,’default’);
- % 如果用户选择取消,则直接返回
- if isequal(filename,0) || isequal(pathname,0)
- return
- end
- % 创建一个新的figure
- newFig = figure;
- % 获取axes控件的单位和位置
- axes_units = get(axesObject,’Units’);
- axes_pos = get(axesObject,’Position’);
- % 将坐标系对象复制到新的figure中
- axesObject2 = copyobj(axesObject,newFig);
- % 重新布局坐标系在新figure中的位置和单位
- set(axesObject2,’Units’,axes_units);
- set(axesObject2,’Position’,[15 5 axes_pos(3) axes_pos(4)]);
- % 如果legendObject被传递进来了
- if (exist(‘legendObject’))
- % 获取legend的位置和单位
- legend_units = get(legendObject,’Units’);
- legend_pos = get(legendObject,’Position’);
- % 将legend也拷贝到心figure
- legendObject2 = copyobj(legendObject,newFig);
- % 重新布局legend对象
- set(legendObject2,’Units’,legend_units);
- set(legendObject2,’Position’,[15-axes_pos(1)+legend_pos(1) 5-axes_pos(2)+legend_pos(2) legend_pos(3) legend_pos(4)] );
- end
- % 调整新figure的单位和位置
- set(newFig,’Units’,axes_units);
- set(newFig,’Position’,[15 5 axes_pos(3)+30 axes_pos(4)+10]);
- % 保存图像
- saveas(newFig,fullfile(pathname, filename))
- % 关闭新figure
- close(newFig)
复制代码
2、实例中使用savePlotWithinGUI()函数
2.1 这里我们已经提供了一个直接的GUI程序 save-image-tutorial.zip (8.62 KB, 下载次数: 995) ,下载后解压到Matlab工作目录,运行GUI得到如下界面
2.2 我们打开save_image_tutorial.m,定位到 plotAxes1_pushbutton_Callback,将看到如下代码
- % 这个就是GUI中Plot Axes 1按钮对应的对调函数
- % 选择绘图坐标系,开始绘图
- axes(handles.axes1)
- x = 0:10;
- y = 0:10;
- plot(x,y);
- % 添加标题和标签
- title(‘Axes 1’);
- xlabel(‘X data’);
- ylabel(‘Y data’);
- % 添加图例说明,并将其句柄保存到handles结构体中
- handles.legend_plot1 = legend(‘data’); % 保存以后方便以后直接使用
- % 更新handles结构体
- guidata(hObject, handles); % 必须更新,因为handles改变了
复制代码
2.3 在将光标定位到savePlot2_pushbutton_Callback,代码如下
- function savePlot2_pushbutton_Callback(hObject, eventdata, handles)
- % 在GUI的回调函数中调用savePlotWithinGUI函数,保存axes中的图形
- % 第一个参数是axes的句柄,handles.handles.axes2
- % 第二个参数是legend的句柄 handles.legend_plot2
- savePlotWithinGUI(handles.axes2,handles.legend_plot2);
复制代码
呵呵,原理和操作就这么简单,只是大家没有想到罢了!祝你愉快。。。。 |