Day12 认识GUI(2)

5. 对话框 — dialog、uigetfile、uiputfile…(函数)

  • 功能:对话框用于显示信息和获取输入数据
  • 以下格式为常用格式,其他调用可是可以查表

1)空的模态对话框 — dialog

2)打开文件的对话框— uigetfile

  • 格式:[文件名, 文件路径(, 筛选器索引)] = uigetfile(文件类型,对话框标题名,返回的文件类型);

3)保存文件的对话框 — uiputfile

  • 格式:[文件名, 文件路径(, 筛选器索引)] = uiupfile(文件类型,对话框标题名,返回的文件类型);

4)通用信息对话框 — msgbox

  • 格式:msgbox(需要显示的消息,对话框标题名,消息框中的图标(,对话框设置createmode));

    createmode可以取‘modal’、‘non-modal’、‘replace’或结构体数组

5)错误信息对话框 — errordlg

  • 格式:HANDLE = errordlg(需要显示的消息,对话框标题名(,对话框设置createmode));

    createmode可以取‘modal’、‘non-modal’、‘replace’或结构体数组

  • 例子:实现图像打开、显示、镜像变换与存储

    clear,clc,close all;
    clc,clear,close all;
    hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none');
    
    ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on');
    ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on');
    
    hm1 = uimenu(hf,'Label','文件');
    hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1}); %只能打开matlabCode文件夹里面的文件
    hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2});
    hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack});
    
    hm2 = uimenu(hf,'label','退出','CallBack','close(hf)');
    
    function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数
        fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数
        [images,~] = uigetfile(fmt,'打开图像','*.jpg');
        global Image; %j将变量声明为全局变量
        Image = imread(images);
        axes(ax);
        imshow(Image),title('原始图像');
        axis off;
    end
    
    function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数
        global result; 
        global Image;
        result = fliplr(Image); %水平镜像
        axes(ax);
        imshow(result),title('水平镜像');
        axis off;
    end
    
    function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数
        global result; 
        if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框
            mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器
            errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数
        else
            [FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为');
            FileFullName = strcat(PathName, FileName);
            imwrite(result,FileFullName);
        end
    end
    
    
  • 初始界面

  • 文件下面的下拉标签,选取打开图像

  • 将打开的图像进行水平镜像操作

  • 保存图像

6)问题提示对话框 — questdlg

  • 采用questdlg函数提出问题并接受用户的回’Yes’、‘No’、‘Cancel’、’ ’

  • 格式:ButtonName = questdlg(问题信息,对话框标题,按钮);

  • 例子:创建一个提示对话框,选择是否退出

clear,clc,close all;

hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none');

ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on');
ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on');

hm1 = uimenu(hf,'Label','文件');
hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1}); 
hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2});
hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack});

hm2 = uimenu(hf,'label','退出','CallBack',{@close_CallBack, hf});

function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数
    fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数
    [images,~] = uigetfile(fmt,'打开图像','*.jpg');
    global Image; %将变量声明为全局变量
    Image = imread(images);
    axes(ax);
    imshow(Image),title('原始图像');
    axis off;
end

function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数
    global result; 
    global Image;
    result = fliplr(Image); %水平镜像
    axes(ax);
    imshow(result),title('水平镜像');
    axis off;
end

function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数
    global result; 
    if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框
        mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器
        errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数
    else
        [FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为');
        FileFullName = strcat(PathName, FileName);
        imwrite(result,FileFullName);
    end
end

function close_CallBack(~,~,hf)
    ButtonName = questdlg('是否确定退出?','退出');
    switch ButtonName
        case 'Yes'
            close(hf);
        otherwise
            msgbox('请继续使用','你好'); 
    end
end


例子:把图像镜像的方法改一下,镜像前显示一个问题提示对话框

clear,clc,close all;

hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none');

ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on');
ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on');

hm1 = uimenu(hf,'Label','文件');
hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1}); %只能打开matlabCode文件夹里面的文件
hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2});
hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack});

hm2 = uimenu(hf,'label','退出','CallBack',{@close_CallBack, hf});

function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数
    fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数
    [images,~] = uigetfile(fmt,'打开图像','*.jpg');
    global Image; %j将变量声明为全局变量
    Image = imread(images);
    axes(ax);
    imshow(Image),title('原始图像');
    axis off;
end

function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数
    global result; 
    global Image;
    ButtonName = questdlg('是否要进行镜像处理?','图像镜像处理');
    switch ButtonName
        case 'Yes'
             result = fliplr(Image); %水平镜像
            axes(ax);
            imshow(result),title('水平镜像');
            axis off;
        otherwise
            msgdlg('欢迎下次处理','你好');
    end
end

function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数
    global result; 
    if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框
        mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器
        errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数
    else
        [FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为');
        FileFullName = strcat(PathName, FileName);
        imwrite(result,FileFullName);
    end
end

function close_CallBack(~,~,hf)
    ButtonName = questdlg('是否确定退出?','退出');
    switch ButtonName
        case 'Yes'
            close(hf);
        otherwise
            msgbox('请继续使用','你好'); 
    end
end

7)警告信息对话框 — warndlg

  • 格式:HANDLE = warndlg(内容,对话框标题);

8)输入信息对话框 — inputdlg

  • 格式:ANSWER = inputdlg(输入的字段,对话框标题,常数/列向量/行向量/2列矩阵,默认值);

  • 例子:inputdlg对话框里面输入要求,根据结果实现图像处理。在上例的基础上,加一个阈值化和灰度化

    (展示增加的代码)

hm3 = uimenu(hf,'Label','图像增强');
hm31 = uimenu(hm3,'Label','输入要求','CallBack',{@InputR_CallBack,ax2});

function InputR_CallBack(~,~,ax)
    global Image;
    global result;
    
    prompt = {'请输入处理要求(阈值化或灰度化):','请输入参数(阈值或通道颜色通道):'};%两个输入窗口的提示信息
    name = '输入要求'; %窗口标题
    lines = 1; %输入窗口的行数为1
    def = {'阈值化','128'}; %设置默认输入
    
    answer = inputdlg(prompt,name,lines,def);
    if length(answer) == 0
        return;
    end
    
    method = string(answer{1}); %获取第一个输入,字符串表示
    value = str2num(answer{2}); %获取第二个输入,数字表示
    axes(ax);
    
    switch method
        case '阈值化'
            value = value/255;
            result = imbinarize(rgb2gray(Image),value);
            imshow(result),title(method);
        case '灰度化'
            chan = uint8(value);
            result = Image(:,:,chan);
            imshow(result),title(method);
        otherwise
            warndlg('输入不合法!','警告');
    end
end

  • 初始界面

  • 阈值化

    在这里插入图片描述在这里插入图片描述

  • 灰度化

  • 输入错误显示警告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值