但是,如果在我们没有打开图片的情况下,要是点击了“图像二值化”会出现什么问题呢?可以看到显示的图像是全黑的,完全没有意义。所以,我们可以在没有点击“打开”菜单项的时候,使“图像处理”菜单不可用。那么在pjimage.m的OpeningFcn中,添加如下程序:set(handles.m_image,'Enable','off');
在“打开”菜单项的Callback函数的最后,添加如下程序:set(handles.m_image,'Enable','on');
这样的话,只要你不点“打开”,就不能用“图像处理”菜单中的命令,效果如下:
点击“打开”之后,就能使用了。
下面,我们来说说前面的问题,就是询问是否保存图片的问题。首先,我们要设置两个标志:一个是图片是否被处理过了,二是图片是否被保存了。那么我们在pjimage_OpeningFcn中,添加如下的两个应用程序数据。setappdata(handles.figure_pjimage,'bSave',false);setappdata(handles.figure_pjimage,'bChanged',false);
然后在“图像二值化”菜单项的Callback函数中,改变bChanged的值为true,即添加如下程序:
setappdata(handles.figure_pjimage,'bChanged',true);
由于我们要保存的是坐标轴axes_dst中的图像,而我们“文件”下的“保存”,实质上保存的是坐标轴axes_src中的图像,那怎么办呢?只好再添加一个“保存”菜单项了。这次,我们在坐标轴axes_dst中添加右键菜单。
打开工具栏的菜单编辑器,选择ContextMenu(上下文菜单),如下:
然后,新建一个ContextMenu,其Tag属性为:axes_dst_menu,如下:
然后为其添加菜单项:“保存”,其Tag属性为axes_dst_menu_save.如上图。然后,在坐标轴axes_dst上右键,选择“PropertyInspector”。将该坐标轴的UIContextMenu属性更改为axes_dst_menu.如下图:
然后,保存,运行。在axes_dst上点右键就能看到
“保存”菜单了。下面来写其函数。
[filename,pathname]=uiputfile({'*.bmp','BMPfiles';'*.jpg;','JPGfiles'},'PickanImage');
ifisequal(filename,0)||isequal(pathname,0)
return;else
fpath=fullfile(pathname,filename);
end
img_dst=getimage(handles.axes_dst);imwrite(img_dst,fpath);
setappdata(handles.figure_pjimage,’bSave’,true);
但是你会发现,没有读入图片之前,在axes_dst点右键是有菜单的,一旦二值化之后,再次点右键就没有菜单了。但是,当我们把右键菜单axes_dst_menu,添加到figure窗口(在没有控件的地方,双击,即可打开figure的属性窗口)的UIContextMenu的时候,就不会出现上面的问题,而且一切运行正常。因为,当你添加到axes_dst之后,一旦坐标轴的内容改变,就会将右键菜单附加到父对象上。因此,如果一定需要在坐标轴上显示右键菜单,就要通过程序创建了。如何创建,咱们先不说,先说说把坐标轴axes_dst保存完毕,退出程序的时候的处理。
将原来的m_file_exit_Callback更改为如下程序:
bChanged=getappdata(handles.figure_pjimage,'bChanged');%获得是否更改bSave=getappdata(handles.figure_pjimage,'bSave');%获得是否保存ifbChanged==true&&bSave==false,%更改了,而没保存时
btnName=questdlg('您已经更改了图片,但没有保存。要保存吗?','提示','保存','不保存','保存');%用提问对话框
switchbtnName,
case'保存',%执行axes_dst_menu_save_Callback的功能
feval(@axes_dst_menu_save_Callback,handles.axes_dst_menu_save,eventdata,handles);
case'不保存',%什么也不做endend
h=findobj('Tag','figure_im2bw');%查找是否打开设置图像二值化参数窗口if~isempty(h),%找到的话,则关闭
close(h);end
close(findobj('Tag','figure_pjimage'));%关闭主窗口下面来为程序添加一个工具栏,单击工具栏上那个的ToolbarEditor,打开如下:
选择“PredefinedTools”下的Open,点击“Add”。再次选择“Save”,点击“Add”。并将Open按钮的Tag属性更改为tbl_open,Save按钮的Tag属性更改为tbl_save,如下:
点“View”,来找到Open按钮的Callback,在它的下面来调用菜单中的打开菜单项的Callback,需要在Open按钮的Callback下写下如下程序:
feval(@m_file_open_Callback,handles.m_file_open,eventdata,handles);用同样的方法,找到Save按钮的Callback,并在它的下面写上保存程序,但是,我们要判断一下是不是第一次保存,如果是,则用保存对话框;如果不是,我们直接保存在第一次保存的路径中就可以了。那么,我们还是需要设置几个应用程序数据的,第一个就是记录是否是第一次保存,第二个是记录第一次保存的路径。这样的话,我们在pjimage_OpeningFcn中添加如下的代码:setappdata(handles.figure_pjimage,'fstSave',true);setappdata(handles.figure_pjimage,'fstPath',0);然后,在Save按钮的Callback下,写下如下的程序:
fstSave=getappdata(handles.figure_pjimage,'fstSave');if(fstSave==true)
[filename,pathname]=uiputfile({'*.bmp','BMPfiles';'*.jpg;','JPGfiles'},'PickanImage');
ifisequal(filename,0)||isequal(pathname,0)
return;else
fpath=fullfile(pathname,filename);end
img_dst=getimage(handles.axes_dst);imwrite(img_dst,fpath);
setappdata(handles.figure_pjimage,'fstPath',fpath);setappdata(handles.figure_pjimage,'bSave',true);setappdata(handles.figure_pjimage,'fstSave',false);else
img_dst=getimage(handles.axes_dst);
fpath=getappdata(handles.figure_pjimage,'fstPath');imwrite(img_dst,fpath);end并且,我们还需要在没有打开图片之前的“文件”下的“保存”和工具栏的“Save”按钮都不可用,只有点击“文件”下的“打开”或工具栏下的“打开”的时候,它们才可用。那么需要在pjimage_OpeningFcn中添加如下代码:set(handles.tbl_save,'Enable','off');set(handles.m_file_save,'Enable','off');
并且在m_file_open_Callback下,添加如下代码:set(handles.tbl_save,'Enable','on');set(handles.m_file_save,'Enable','on');这样一个小程序,算是完成了。