【打开】菜单的回调函数如代码段5所示,该段代码主要功能是交互式读取图像文件到内存中。
%---------------------------------------------------------------------------------------------------------------------------------------
%代码段5
function FileOpen_Callback(hObject, eventdata, handles)
%使用uigetfile函数交互式打开一个jpg格式的图像文件。uigetfile会弹出一个文件选择对话框窗口,
%如果选择了取消或者直接关闭窗口,fileName的返回值为0;如果选择了一个文件并点击确定,返
%回文件名
[fileName,pathName] = uigetfile('*.jpg','Please select a jpg format image');
if (fileName ~= 0)
fileName = strcat(pathName,fileName);%获得图像文件的全路径名
handles.image = imread(fileName);%读入图像文件
handles.height = size(handles.image,1);%获得图像的高度
handles.width = size(handles.image,2);%获得图像的宽度
handles.fileName = fileName;%将fileName存储到handles中,以用于后面的合成结果图像的保存。
axes(handles.axes_showimage);%激活axes_showimage对象,并调用imshow在该对象中显示图像
imshow(handles.image);
set(handles.FileSave,'Enable','Off');%当仅仅是打开图像文件而尚未合成图像时候,应该使【保存】
%菜单不可用
guidata(hObject, handles); %进行handles变量的更新
end
%---------------------------------------------------------------------------------------------------------------------------------------
【保存】菜单的回调函数如代码段6所示,该函数首先自动确定合成图像的文件名,然后执行合成图像的保存工作。
%---------------------------------------------------------------------------------------------------------------------------------------
%代码段6
function FileSave_Callback(hObject, eventdata, handles)
location = strfind(handles.fileName,'.jpg');%在全路径文件名中确定’.jpg’字符串的位置
if (~isempty(location))
%如果打开的原始图像为jpg格式,那么生成全路径的用于保存合成图像的文件名,结果合成图
%像的文件名和原始读入图像在同一目录中
saveFileName = handles.fileName(1:location-1);
saveFileName = strcat(saveFileName,'MixResult.jpg');
else
%否则,生成相对路径的用于保存合成图像的文件名,该文件将存储在主程序所在目录
saveFileName = 'MixResult.jpg';
end
imwrite(handles.finalImage,saveFileName);%保存合成的结果图像
%---------------------------------------------------------------------------------------------------------------------------------------
最后是【合成】菜单的回调函数,该函数首先从所有的编辑文本控件中获得雪花点数、雪花大小、模糊半径、模糊方差、动态大小、运动方向等参数,然后调用第2节结介绍的sub_makeRandPoints、sub_constructSnowEffect和sub_mixImage以最终得到原始图像和三层雪花图像合成的效果图,参考代码段7:
%---------------------------------------------------------------------------------------------------------------------------------------
%代码段7
function MixAll_Callback(hObject, eventdata, handles)
if (~isempty(handles.image))%如果成功打开了原始图像,那么进行图像的合成
img = handles.image;
%获得第一层雪花图像所需的输入参数
firstPointNumber = str2num(get(handles.edit_first_pointnumber,'String'));%首先使用get函数获得控
%件的’String’属性值,并将其由字符串转化成数值类型。
firstPointSize = str2num(get(handles.edit_first_pointsize,'String'));
firstSmoothSize = str2num(get(handles.edit_first_smoothsize,'String'));
firstSmoothSigma = str2num(get(handles.edit_first_smoothsigma,'String'));
firstDynamicSize = str2num(get(handles.edit_first_dynamicsize,'String'));
firstDynamicDirection = str2num(get(handles.edit_first_dynamicdirection,'String'));
%对第一层雪花的位置和大小进行初始分配,产生和原始图像大小相等的随机雪花团的初始图像
maskImageLevelOne = sub_makeRandPoints(handles.height,handles.width,...
firstPointNumber,firstPointSize);
%对第一层随机雪花团的初始图像进行模糊处理
[maskImageLevelOne] = sub_constructSnowEffect(maskImageLevelOne,1,...
firstSmoothSize,firstSmoothSigma,firstDynamicSize,firstDynamicDirection);
%获得第二层和第三层雪花图像所需要的输入参数方法完全类似于第一层,所不同的仅仅是一些
%控件的Tag属性值,这里为了节省篇幅,未将其详尽列出。
%对第二层雪花的位置和大小进行初始分配,产生和原始图像大小相等的随机雪花团的初始图像
maskImageLevelTwo = sub_makeRandPoints(handles.height,handles.width,...
secondPointNumber,secondPointSize);
%对第二层随机雪花团的初始图像进行模糊处理
[maskImageLevelTwo] = sub_constructSnowEffect(maskImageLevelTwo,1,...
secondSmoothSize,secondSmoothSigma,secondDynamicSize,secondDynamicDirection);
%对第三层雪花的位置和大小进行初始分配,产生和原始图像大小相等的随机雪花团的初始图像
maskImageLevelThree = sub_makeRandPoints(handles.height,handles.width,...
thirdPointNumber,thirdPointSize);
%对第三随机雪花团的初始图像进行模糊处理
[maskImageLevelThree] = sub_constructSnowEffect(maskImageLevelThree,0,...
thirdSmoothSize,thirdSmoothSigma,thirdDynamicSize,thirdDynamicDirection);
|