📄 imui.m
字号:
function imui(varargin)
% IMUI - Image Processing Toolbox Utilities for MATLAB 6.1
% Under development
% Kotaimen.C, 2002/5 - 200?/?, All rights reserved.
% Connect to kotaimen_c@citiz.net.
% imui
% imui('ImageFileName')
% imui ImageFileName
% imui(ImageData)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Pre-Initialize
if isempty(getImuiFigureHandles)
V = str2num((version('-release')));
if V < 12.1
error('IMUI requires MATLAB 6.1 (release 12.1) or higher.')
end
try
iptgetpref;
catch
error('IMUI requires Image Processing Toolbox.')
end
D = get(0, 'ScreenDepth');
if D < 16
error('IMUI requires a 16-bit Monitor.')
end
end
if nargin == 0
PreAction = 'NewImage';
else
if isstr(varargin{1})
if length(varargin{1}) >= 4
if varargin{1}(1 : 4) == '::::'
PreAction = 'Callback';
else
PreAction = 'ImageFile';
end
else
PreAction = 'ImageFile';
end
else
PreAction = 'ImageData';
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialize
switch PreAction
case 'NewImage'
CX = im2uint8(ones(300, 400));
imgTitle = ['image', num2str(length(getImuiFigureHandles) + 1)];
Action = '::::BuildGUI';
case 'ImageFile'
try
imgFileInfo = imfinfo(varargin{1});
catch
errstr = sprintf(['Unable to open "',varargin{1}, ...
'", file may not exist or unknown file type.\n', ...
'Type "help imread" for more information.']);
error(errstr)
return
end
h = waitfig(sprintf('Opening %s', varargin{1}));
if strcmpi(imgFileInfo.ColorType, 'indexed')
[CX, CMAP] = imread(varargin{1});
CX = im2uint8( ind2rgb(CX, CMAP) );
else
CX = imread(varargin{1});
end
imgType = imagetype(CX);
imgTitle = varargin{1};
Action = '::::BuildGUI';
delete(h)
case 'ImageData'
CX = varargin{1};
imgType = imagetype(CX);
if nargin > 1
imgTitle = varargin{2};
else
imgTitle = inputname(1);
if isempty(imgTitle)
imgTitle = ['image', num2str(length(getImuiFigureHandles) + 1)];;
end
end
Action = '::::BuildGUI';
case 'Callback'
Action = varargin{1};
ud = get(gcbf, 'UserData');
otherwise
error('Invalid PreAction')
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callback
switch Action
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Build GUI
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::BuildGUI'
hdlFig = figure( ...
'Name', 'imui', ...
'Units', 'pixel', ...
'Menubar', 'none', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Visible', 'off', ...
'Interruptible','off', ...
'Busyaction', 'queue', ...
'Tag', '::::imuiFigure');
hdlTxt = uicontrol(hdlFig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'Position', [0.1 0.1/3 0.8, 0.1/3], ...
'FontName', 'Courier New', ...
'FontSize', 9, ...
'FontWeight', 'bold', ...
'String', '');
hdlAxe = axes( ...
'Units', 'normalized', ...
'Position', [0 0 1 1]);
hdlImg = imshow(im2uint8(CX), 'notruesize');
hdlMenu = buildmenu( hdlFig );
set(hdlAxe, ...
'Visible', 'off', ...
'DrawMode', 'fast', ...
'Box', 'on', ...
'Layer', 'top', ...
'XAxisLocation','top', ...
'GridLineStyle',':', ...
'TickLength', [0.001 0.025], ...
'XGrid', 'on', ...
'YGrid', 'on', ...
'FontSize', 8)
set(hdlImg, ...
'UserData', CX, ...
'CDataMapping', 'scaled')
ifZoom = 0;
ifGrid = 0;
clrGrid = [0 0 0.5];
umtoggle(hdlMenu.GridClr10);
clrFigure = [.8 .8 .8];
umtoggle(hdlMenu.FigureClr2);
styGrid = ':';
umtoggle(hdlMenu.GridStyle3);
ud = struct( ...
'FigureHandle', hdlFig, ...
'TextHandle', hdlTxt, ...
'AxesHandle', hdlAxe, ...
'ImageHandle', hdlImg, ...
'MenuHandles', hdlMenu, ...
'ImageType', imagetype(CX), ...
'ImageClass', class(CX), ...
'ImageTitle', imgTitle, ...
'ImageSize', [size(CX, 2), size(CX, 1)], ...
'ZoomState', ifZoom, ...
'GridState', ifGrid, ...
'GridColor', clrGrid, ...
'FigureColor', clrFigure, ...
'GridLineStyle', styGrid, ...
'DefaultOversampleMethod', 'bicubic', ...
'HistoryData', struct([]), ...
'HistoryIndex', 0, ...
'LastHistoryIndex', 0, ...
'HistoryCount', 0 ...
);
truesize( hdlFig )
movegui(hdlFig, [24, -24] .* (length(getImuiFigureHandles) + 1) )
set(hdlFig, ...
'UserData', ud, ...
'Visible', 'on', ...
'HandleVisibility', 'callback', ...
'Colormap', gray(256), ...
'KeyPressFcn', ' imui( ''::::KeyPress'' ) ', ...
'CloseRequestFcn', ' imui( ''::::CloseRequest'' ) ', ...
'ResizeFcn', ' imui( ''::::Resize'' ) ', ...
'WindowButtonMotionFcn', 'imui( ''::::ButtonMotion'') ', ...
'WindowButtonDownFcn', 'imui( ''::::ButtonDown'') ', ...
'WindowButtonUpFcn', 'imui( ''::::ButtonUp'') ')
AppendToHistory(ud, 'New/Create/Open')
UpdateGUIState(ud)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% UpdateImage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::UpdateImage'
NewCX = varargin{2};
mnuud = get(gcbo, 'UserData');
NewImgType = imagetype(NewCX);
NewImgClass = class(NewCX);
NewImgSize = [size(NewCX, 2), size(NewCX, 1)];
LastActionName = mnuud.ActionName;
if all(NewImgSize == ud.ImageSize)% & strcmp(NewImgType, ud.ImageType)
if strcmp(NewImgClass, 'double')
NewCX(NewCX > 1) = 1;
NewCX(NewCX < 0) = 0;
NewImgType = imagetype(NewCX);
end
set(ud.ImageHandle, 'UserData', NewCX)
DisplayFunction(ud.ImageHandle)
ud.ImageClass = NewImgClass;
ud.ImageType = NewImgType;
ud.ImageSize = NewImgSize;
AppendToHistory(ud, mnuud.ActionName)
UpdateGUIState(ud)
else
imui(NewCX, [ud.ImageTitle, ' - ' ,mnuud.ActionName])
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% RESIZEFCN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::Resize'
UpdateImageDisplayRatio(ud)
case '::::ButtonDown'
UpdateImageDisplayRatio(ud)
case '::::ButtonUp'
UpdateImageDisplayRatio(ud)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% KEYPRESSFCN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::KeyPress'
keychar = get(ud.FigureHandle, 'CurrentCharacter');
switch keychar
case ' '
imui('::::mnucb_HideMenu')
case {'Z', 'z'}
imui('::::mnucb_Zoom')
case {'G', 'g', ';'}
imui('::::mnucb_Grid')
case {'+', '='}
imui('::::mnucb_ZoomIn');
case {'-', '_'}
imui('::::mnucb_ZoomOut');
case '/'
imui('::::mnucb_ZoomTrue');
case '*'
imui('::::mnucb_ZoomFit');
case '.'
imui('::::mnucb_ZoomFig');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% CLOSEREQUESTFCN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::CloseRequest'
ud = get(gcf, 'UserData');
for i = 1 : ud.HistoryCount
delete([ud.HistoryData(i).FileName, '.mat'])
end
delete(gcf)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% WINDOWBUTTONMOTIONFCN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::ButtonMotion'
if ud.GridState
temp = get(ud.AxesHandle, 'CurrentPoint');
cpX = round( temp(1, 1) );
cpY = round( temp(1, 2) );
if all([cpX <= ud.ImageSize(1), cpX >=1 ...
cpY <= ud.ImageSize(2), cpY >=1])
CX = get(ud.ImageHandle, 'UserData');
switch ud.ImageClass
case 'uint8'
CX = double(CX(cpY, cpX, :));
case 'uint16'
CX = round( double(CX(cpY, cpX, :)) / 255 );
otherwise
CX = round(CX(cpY, cpX, :) * 255);
end
if strcmp(ud.ImageType, 'RGB')
textstr = sprintf( 'X : %4d, Y : %4d; RGB(%3d, %3d, %3d)', ...
cpX, cpY, CX);
else
textstr = sprintf( 'X : %4d, Y : %4d; Black(%3d) ', ...
cpX, cpY, CX);
end
else
textstr = 'Out of image';
end
set(ud.TextHandle, 'String', textstr)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% File menu callbacks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::mnucb_File'
if length(pwd) < 60
set(ud.MenuHandles.CurDir, 'Label', pwd)
else
set(ud.MenuHandles.CurDir, 'Label', 'Current DIR')
end
case '::::mnucb_New'
prompt = {sprintf('Enter image name :\n'), ...
sprintf('Enter X size (in pixels) :\n'), ...
sprintf('Enter Y size (in pixels) :\n')};
default = {['image', num2str(length(getImuiFigureHandles) + 1)], ...
num2str(ud.ImageSize(1)), num2str(ud.ImageSize(2))};
dlgtitle = 'New image';
answer = inputdlg(prompt, dlgtitle, 1, default);
if ~isempty(answer)
imgTitle = answer{1};
Xsize = round(str2num(answer{2}));
Ysize = round(str2num(answer{3}));
if Xsize >= 0 & Ysize >=0
imui(im2uint8(ones(Ysize, Xsize)), imgTitle)
end
end
case '::::mnucb_Duplicate'
imui(get(ud.ImageHandle, 'UserData'), [ud.ImageTitle, ' - copy'])
case '::::mnucb_Open'
[filename, pathname] = uigetfile( {...
'*.jpg;*.tif;*.gif;*.bmp;*.png', 'All image files(*.jpg,*.tif,*.gif,*.bmp,*.png)';
'*.jpg;*.jpeg', 'JPEG files(*.jpg)';
'*.gif', 'GIF files(*.gif)';
'*.tif;*.tiff', 'TIFF files(*.tif)';
'*.bmp', 'BMP files(*.bmp)';
'*.png', 'PNG files(*.png)';
'*.*', 'All Files (*.*)'}, 'Open an image');
if ischar(filename)
imui([pathname, filename])
end
case '::::mnucb_Save'
[filename, pathname] = uiputfile( ...
ud.ImageTitle, 'Save as...');
if ischar(filename)
try
imwrite(get(ud.ImageHandle, 'UserData'), ...
[pathname, filename])
catch
errordlg(sprintf('Error while saving file: %s.\n%s', ...
[pathname, filename], lasterr), 'IMUI', 'modal');
end
end
case '::::mnucb_CurDir'
fileext = {'jpg', 'tif', 'gif', 'bmp', 'png'};
filelist = '';
%Build file list
for i = 1 : length(fileext)
FS = dir(['*.', char(fileext{i})]);
if ~isempty(FS)
for j = 1 : length(FS)
filelist = strvcat(filelist, FS(j).name);
end
end
end
filelist = sortrows(filelist);
hsubmenu = allchild(ud.MenuHandles.CurDir);
if ~isempty(filelist)
for i = 1 : size(filelist, 1);
mnulabel = deblank( filelist(i, :) );
uimenu( ud.MenuHandles.CurDir, ...
'Label', mnulabel, ...
'Tag', mnulabel, ...
'Callback', 'imui( ''::::mnucb_CurDir_ChildCbFCN'' )');
end
else
uimenu( ud.MenuHandles.CurDir, ...
'Label', 'There is no image file in current directory', ...
'Enable', 'off');
end
if ~isempty(hsubmenu)
delete(hsubmenu)
end
case '::::mnucb_CurDir_ChildCbFCN'
imui(get(gcbo, 'Tag'))
case '::::mnucb_Import'
workspacevars = evalin('base', 'whos');
varlist = '';
for i = 1 : length(workspacevars)
varclass = workspacevars(i).class;
if any( strcmpi(varclass, {'double'; 'uint8'; 'uint16'}) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -