function saveas2(varargin)
%SAVEAS2 Saves figure with actual size.
%
% SYNTAX:
% saveas2
% saveas2(NAME) % NAME may be []
% saveas2(NAME,RESOLUTION)
% saveas2(NAME,RESOLUTION,FORMAT) % FORMAT may be: 'unknown'
% saveas2(NAME,RESOLUTION,FORMAT,PRINTOPT)
% saveas2(HANDLE,...)
%
% INPUT:
% HANDLE - Figure handle. See NOTE below.
% DEFAULT: gcf
% NAME - String specifying the output figure name file. May
% include full/relative path and with/without extension.
% DEFAULT: Promts gui for user input if empty.
% RESOLUTION - Figure resolution.
% DEFAULT: 150 (150 dpi).
% FORMAT - Output figure format. Use 'unknown' to display a list.
% See NOTE below.
% DEFAULT '.png'
% PRINTOPT - Extra options for the PRINT function.
% DEFAULT: none
%
% DESCRIPTION:
% Depending on the FORMAT, this functions uses PRINT or SAVEAS
% functions to save the specified (HANDLE) figure(s) matching the size
% it has on screen.
%
% This is a mayor modification of Gabe Hoffmann function SAVE2PDF that
% allows multiple formats (including '.fig'). Besides, it may display
% a gui for output filename and image extension.
%
% NOTE:
% * Optional inputs use its DEFAULT value when not given or [].
% * Optional outputs may or not be called.
% * When specifing several handles, the same quantity of filenames
% shold be given as a cell of strings.
% * When no FORMAT is given, it is extracted from the NAME extension.
% * If FORMAT was invalid, the user is asked to select a valid one from
% a list. See PRINTTABLE for details.
% * If the filename already exist it will be OVERWRITTEN without any
% warning!!!
%
% EXAMPLE:
% figure, imagesc(peaks(40))
% % Saves current figure asking for the name
% saveas2
% % Saves with specific name, format and resolution
% saveas2('peaks.jpg',300)
% % Saves the '.fig' file
% saveas2('peaks.fig')
% % Saves displaying a list of extensions (or devices)
% saveas2('peaks',[],'unknown')
%
% SEE ALSO:
% SAVEAS, PRINT
% and
% SAVE2PDF by Gabe Hoffmann
% at http://www.mathworks.com/matlabcentral/fileexchange
%
%
% ---
% MFILE: saveas2.m
% VERSION: 1.1 (Sep 30, 2009) (download)
% MATLAB: 7.7.0.471 (R2008b)
% AUTHOR: Carlos Adrian Vargas Aguilera (MEXICO)
% CONTACT: nubeobscura@hotmail.com
% REVISIONS:
% 1.0 Released. (Aug 20, 2009)
% 1.1 Fixed important bug with 'fig' format and multiple figures.
% (Sep 30, 2009)
% DISCLAIMER:
% saveas2.m is provided "as is" without warranty of any kind, under the
% revised BSD license.
% Copyright (c) 2009 Carlos Adrian Vargas Aguilera
% INPUTS CHECK-IN
% -------------------------------------------------------------------------
% Defaults:
NAME = '';
HANDLE = gcf;
FORMAT = 'png';
RESOLUTION = '150';
PRINTOPT = {};
% Parameters:
givenFORMAT = false;
dformat = FORMAT;
% First checks HANDLE.
if ~isempty(varargin) && any(ishandle(varargin{1}))
HANDLE = varargin{1};
varargin(1) = [];
end
% Now other inputs.
if ~isempty(varargin)
% Checks NAME.
if ~isempty(varargin{1}) && ischar(varargin{1})
NAME = varargin{1};
end
varargin(1) = [];
if ~isempty(varargin)
% Checks RESOLUTION.
if ~isempty(varargin{1}) && isnumeric(varargin{1})
RESOLUTION = int2str(varargin{1});
end
varargin(1) = [];
if ~isempty(varargin)
% Checks FORMAT.
if ~isempty(varargin{1}) && ischar(varargin{1})
FORMAT = varargin{1}(1,:);
givenFORMAT = true;
if strcmp(FORMAT(1),'.')
FORMAT(1) = '';
if isempty(FORMAT)
givenFORMAT = false;
end
end
end
varargin(1) = [];
if ~isempty(varargin)
% Checks PRINTOPT.
PRINTOPT = varargin;
clear varargin
end
end
end
end
% Gets size.
N = length(HANDLE);
% Checks NAME:
if isempty(NAME)
if N~=1
error('CVARGAS:saveas2:tooManyHandles',...
'NAMEs should be given when more than one figure.')
end
[thefile,thedir] = uiputfile('*','Save to file:');
if thefile==0; return; end
NAME = fullfile(thedir,thefile);
end
% Changes char to cell.
if ischar(NAME)
NAME = {NAME};
end
% Checks sizes.
Nn = length(NAME);
if Nn~=N
error('CVARGAS:saveas2:incorrectHandlesAndNamesLengths',...
'Length NAME and HANDLE must match.')
end
% -------------------------------------------------------------------------
% MAIN
% -------------------------------------------------------------------------
% Main loop
checkDev = true;
theext = '';
for cont = 1:N
name = NAME{cont};
handle = HANDLE(cont);
if ~ishandle(handle)
continue
end
% Looks for extension for FORMAT.
if ~givenFORMAT
[thedir,thename,theext] = fileparts(name);
if length(theext)>2
FORMAT = theext(2:end);
else
FORMAT = dformat;
end
name = fullfile(thedir,thename);
end
% Uses SAVEAS.
if strcmpi(FORMAT,'m') || strcmpi(FORMAT,'fig') || ...
strcmpi(FORMAT,'mfig') || strcmpi(FORMAT,'mmat')
saveas(handle,name,FORMAT)
continue % Fixed BUG Sep 2009
end
% Backup original figure settings.
prePaperType = get(handle,'PaperType');
prePaperUnits = get(handle,'PaperUnits');
preUnits = get(handle,'Units');
prePaperPosition = get(handle,'PaperPosition');
prePaperSize = get(handle,'PaperSize');
% Make changing paper type possible
set(handle,'PaperType','');
% Set units to all be the same
set(handle,'PaperUnits','inches');
set(handle,'Units' ,'inches');
% Set the page size and position to match the figure's dimensions
position = get(handle,'Position');
set(handle,'PaperPosition',[0 0 position(3:4)]);
set(handle,'PaperSize' ,position(3:4));
% Checks print device.
if checkDev
% Gets valid devices.
[ops,dev,ext] = printtables;
[ext,ind] = sort(ext);
dev = dev(ind);
% Looks extensions.
i = strmatch(FORMAT,ext);
if length(i) >= 1
i = i(1);
elseif isempty(i)
% Looks devices.
i = strmatch(FORMAT,dev,'exact');
if isempty(i)
i = strmatch(FORMAT,dev);
if ~isempty(i)
i = i(1);
end
end
end
if ~isempty(i)
FORMAT = dev{i};
else
% Promts for print device.
ind = menu('SELECT IMAGE FILE EXTENSION (or DEVICE)',...
cellfun(@(a,b)[upper(a) ' (' b ')'],ext,dev,'UniformOutput',false));
if ind==0
return
end
FORMAT = dev{ind};
name = [name theext];
if ~isempty(ext{ind}) && ~strcmp(theext,ext{ind})
name = [name '.' ext{ind}];
end
end
if ~givenFORMAT
checkDev = false;
end
end
% Uses PRINT.
print(handle,name,['-d' FORMAT],['-r' RESOLUTION],PRINTOPT{:})
% Restores figure settings.
set(handle,'PaperType' ,prePaperType);
set(handle,'PaperUnits' ,prePaperUnits);
set(handle,'Units' ,preUnits);
set(handle,'PaperPosition',prePaperPosition);
set(handle,'PaperSize' ,prePaperSize);
end
% [EOF] saveas2.m