如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题

本人在用使用MATLAB GUI制作界面的过程中,要实现从文件夹中读取图片,单击确定按钮后并显示图片,对于其中关键性的问题搜集了众多资料进行解决,现将其进行梳理。

该功能部分所需要的控件为:2个按钮(Pushbutton),用于选择图片和确定以显示图片;1个可编辑文本框(edit),用于显示文件路径和文件名;1个坐标轴框(axes)用于显示图像。

这部分的界面如下图所示:

如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题_第1张图片

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)弹出的文件夹选择框:

如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题_第2张图片

(2)选择好文件之后,单击打开,文件路径以及文件名会显示到“选择图片”按钮后面的静态文本框中,如下图所示:

(3)如果没有选择到图片,会弹出“未成功选择文件,请重新选择”的提示框,也就是上面if判断那里写过的,如下图所示:

如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题_第3张图片

至此从文件夹选择图片的功能已经完成。

接下来要实现的是单击“确定”按钮,可以在坐标轴控件中显示刚才所选择性的图片。


这个地方是重点!!!涉及到不同回调函数之间的变量传递问题,都是通用的,会一个其他的都可以解决。

注意我这里提到的不同回调函数之间的变量传递是在同一个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控件中,效果如下:

如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题_第4张图片

至此,功能就完成啦!

当然,有人可能有疑问,imread函数的使用不是imread('l路径')嘛,上面代码为啥引号没了?这个问题我当时解决了好久,最后在matlab中进行单步调试,在工作区(见下图)中发现,这个road的值本身就带有引号,所以此时使用imread函数反而就报错啦!

如何实现MATLAB GUI界面中,从文件夹中读取图片,确定后并显示,以及不同回调函数之间变量的传递问题_第5张图片

至此,本文一开始提到的功能就完成了!

不同回调函数之间变量的传递是个重点,尤其进行图像处理时,要递进进行,变量传递是必不可少的。

你可能感兴趣的:(MATLAB,matlab,gui)