本人在用使用MATLAB GUI制作界面的过程中,要实现从文件夹中读取图片,单击确定按钮后并显示图片,对于其中关键性的问题搜集了众多资料进行解决,现将其进行梳理。
该功能部分所需要的控件为:2个按钮(Pushbutton),用于选择图片和确定以显示图片;1个可编辑文本框(edit),用于显示文件路径和文件名;1个坐标轴框(axes)用于显示图像。
这部分的界面如下图所示:
1.实现点击“选择图片”按钮从文件夹读取文件,选择需要的对象:
进入到“选择图片”按钮的回调函数(右击选择图片按钮---单击查看回调----选择Callback),在该按钮的回调函数中添加以下代码段:
[filename filepath]=uigetfile({'*.bmp;*.jpg'},'选择图片文件');
set(handles.edit3,'string',[filepath filename])
由于本人要显示的是图片,所以文件类型只选择了.bmp和.jpg两种格式,当然你可以根据自己的需求自己添加啦!edit3就是静态文本框的Tag值,用于识别不同的控件。
filename中保存的是文件名,filepath中保存的是路径,注意第二句代码中一定是filepath在前,以便后面可以读取到文件。
如果想在未选择到照片时给出提示,可将其修改为if语句控制:
if isequal(filename,0) || isequal(filepath,0)
errordlg('没有选中文件,请重新选择','出错');
return;
else
set(handles.edit3,'string',[filepath filename])
end
实现效果如下图:
(1)弹出的文件夹选择框:
(2)选择好文件之后,单击打开,文件路径以及文件名会显示到“选择图片”按钮后面的静态文本框中,如下图所示:
(3)如果没有选择到图片,会弹出“未成功选择文件,请重新选择”的提示框,也就是上面if判断那里写过的,如下图所示:
至此从文件夹选择图片的功能已经完成。
接下来要实现的是单击“确定”按钮,可以在坐标轴控件中显示刚才所选择性的图片。
这个地方是重点!!!涉及到不同回调函数之间的变量传递问题,都是通用的,会一个其他的都可以解决。
注意我这里提到的不同回调函数之间的变量传递是在同一个GUI界面下的哦,不是不同GUI界面之间的传递。
实现同一个界面下不同控件的回调函数之间的变量传递有多种方法,如采用global全局变量、通过handles传递数据、通过setappdata 和 getappdata实现、通过save 和 load等一些方法。推荐使用通过handles的方法。
下面介绍handles方法在不同回调函数间传递变量的方法:
比如要A回调函数中的有个变量,B回调函数需要这个变量的值,这就需要从A传递到B。
在A回调函数中添加下面代码:
handles.X=X;
guidata(hObject, handles)
注意两行代码必须在一块写,代码中X表示需要传递的变量。
在B回调函数中添加下面代码:
X=handles.X;
此时就完成了参数的传递。
2.实现单击“确定”按钮,在坐标轴中显示出所选的照片:
在“选择图片”按钮的回调函数下,将上文中文本框中的路径赋值给road,作为传递的变量,在利用handles传递,代码如下:
road=get(handles.edit3,'String');
handles.road=road;
guidata(hObject, handles)
然后在“确定”按钮的回调函数下,添加下面代码:
road=handles.road;
axes(handles.axes3); %在第一个轴中显示
imshow(road);
第一行用于完成传递的变量,后两行用于将图片显示在axes控件中,效果如下:
至此,功能就完成啦!
当然,有人可能有疑问,imread函数的使用不是imread('l路径')嘛,上面代码为啥引号没了?这个问题我当时解决了好久,最后在matlab中进行单步调试,在工作区(见下图)中发现,这个road的值本身就带有引号,所以此时使用imread函数反而就报错啦!
至此,本文一开始提到的功能就完成了!
不同回调函数之间变量的传递是个重点,尤其进行图像处理时,要递进进行,变量传递是必不可少的。