• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

matlab所见即所得式保存图片

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

学到一个很好用的东西:exportfig,所见即所得式保存图片,在fig窗口看到什么样的就可以说保存为什么样的,所以可以先手动窗口,觉得合适了就用一下这个函数,print是做不到的。

用法:将exportfig.m文件放到对应工程目录即可使用,代码在最后附上。代码里面有详细说明怎么用的。

% 一个例子
exportfig(gcf, \'hah.jpg\', \'Format\', \'jpeg\',\'width\',66)

参考:让你的Figure生成可以用在文献里的图片

代码:

function exportfig(varargin)
%EXPORTFIG  Export a figure to Encapsulated Postscript.
%   EXPORTFIG(H, FILENAME) writes the figure H to FILENAME.  H is
%   a figure handle and FILENAME is a string that specifies the
%   name of the output file.
%
%   EXPORTFIG(...,PARAM1,VAL1,PARAM2,VAL2,...) specifies
%   parameters that control various characteristics of the output
%   file.
%
%   Format Paramter:
%     \'Format\'  one of the strings \'eps\',\'eps2\',\'jpeg\',\'png\',\'preview\'
%          specifies the output format. Defaults to \'eps\'.
%          The output format \'preview\' does not generate an output
%          file but instead creates a new figure window with a
%          preview of the exported figure. In this case the
%          FILENAME parameter is ignored.
%
%     \'Preview\' one of the strings \'none\', \'tiff\'
%          specifies a preview for EPS files. Defaults to \'none\'.
%
%   Size Parameters:
%     \'Width\'   a positive scalar
%          specifies the width in the figure\'s PaperUnits
%     \'Height\'  a positive scalar
%          specifies the height in the figure\'s PaperUnits
%
%     Specifying only one dimension sets the other dimension
%     so that the exported aspect ratio is the same as the
%     figure\'s current aspect ratio. 
%     If neither dimension is specified the size defaults to 
%     the width and height from the figure\'s PaperPosition. 
%           
%   Rendering Parameters:
%     \'Color\'     one of the strings \'bw\', \'gray\', \'cmyk\'
%         \'bw\'    specifies that lines and text are exported in
%                 black and all other objects in grayscale
%         \'gray\'  specifies that all objects are exported in grayscale
%         \'cmyk\'  specifies that all objects are exported in color
%                 using the CMYK color space
%     \'Renderer\'  one of the strings \'painters\', \'zbuffer\', \'opengl\'
%         specifies the renderer to use
%     \'Resolution\'   a positive scalar
%         specifies the resolution in dots-per-inch.
%     
%     The default color setting is \'bw\'.
%
%   Font Parameters:
%     \'FontMode\'     one of the strings \'scaled\', \'fixed\'
%     \'FontSize\'     a positive scalar
%          in \'scaled\' mode multiplies with the font size of each
%          text object to obtain the exported font size
%          in \'fixed\' mode specifies the font size of all text
%          objects in points
%     \'FontEncoding\' one of the strings \'latin1\', \'adobe\'
%          specifies the character encoding of the font
%
%     If FontMode is \'scaled\' but FontSize is not specified then a
%     scaling factor is computed from the ratio of the size of the
%     exported figure to the size of the actual figure. The minimum
%     font size allowed after scaling is 5 points.
%     If FontMode is \'fixed\' but FontSize is not specified then the
%     exported font sizes of all text objects is 7 points.
%
%     The default \'FontMode\' setting is \'scaled\'.
%
%   Line Width Parameters:
%     \'LineMode\'     one of the strings \'scaled\', \'fixed\'
%     \'LineWidth\'    a positive scalar
%          the semantics of LineMode and LineWidth are exactly the
%          same as FontMode and FontSize, except that they apply
%          to line widths instead of font sizes. The minumum line
%          width allowed after scaling is 0.5 points.
%          If LineMode is \'fixed\' but LineWidth is not specified 
%          then the exported line width of all line objects is 1
%          point. 
%
%   Examples:
%     exportfig(gcf,\'fig1.eps\',\'height\',3);
%       Exports the current figure to the file named \'fig1.eps\' with
%       a height of 3 inches (assuming the figure\'s PaperUnits is 
%       inches) and an aspect ratio the same as the figure\'s aspect
%       ratio on screen.
%
%     exportfig(gcf, \'fig2.eps\', \'FontMode\', \'fixed\',...
%                \'FontSize\', 10, \'color\', \'cmyk\' );
%       Exports the current figure to \'fig2.eps\' in color with all
%       text in 10 point fonts. The size of the exported figure is
%       the figure\'s PaperPostion width and height.


if (nargin < 2)
  error(\'Too few input arguments\');
end

% exportfig(H, filename, ...)
H = varargin{1};
if ~ishandle(H) | ~strcmp(get(H,\'type\'), \'figure\')
  error(\'First argument must be a handle to a figure.\');
end
filename = varargin{2};
if ~ischar(filename)
  error(\'Second argument must be a string.\');
end
paramPairs = varargin(3:end);

% Do some validity checking on param-value pairs
if (rem(length(paramPairs),2) ~= 0)
  error([\'Invalid input syntax. Optional parameters and values\' ...
     \' must be in pairs.\']);
end

format = \'eps\';
preview = \'none\';
width = -1;
height = -1;
color = \'bw\';
fontsize = -1;
fontmode=\'scaled\';
linewidth = -1;
linemode=[];
fontencoding = \'latin1\';
renderer = [];
resolution = [];

% Process param-value pairs
args = {};
for k = 1:2:length(paramPairs)
  param = lower(paramPairs{k});
  if (~ischar(param))
    error(\'Optional parameter names must be strings\');
  end
  value = paramPairs{k+1};

  switch (param)
   case \'format\'
    format = value;
    if (~strcmp(format,{\'eps\',\'eps2\',\'jpeg\',\'png\',\'preview\'}))
      error([\'Format must be \'\'eps\'\', \'\'eps2\'\', \'\'jpeg\'\', \'\'png\'\' or\' ...
         \' \'\'preview\'\'.\']);
    end
   case \'preview\'
    preview = value;
    if (~strcmp(preview,{\'none\',\'tiff\'}))
      error(\'Preview must be \'\'none\'\' or \'\'tiff\'\'.\');
    end
   case \'width\'
    width = LocalToNum(value);
    if(~LocalIsPositiveScalar(width))
      error(\'Width must be a numeric scalar > 0\');
    end
   case \'height\'
    height = LocalToNum(value);
    if(~LocalIsPositiveScalar(height))
      error(\'Height must be a numeric scalar > 0\');
    end
   case \'color\'
    color = lower(value);
    if (~strcmp(color,{\'bw\',\'gray\',\'cmyk\'}))
      error(\'Color must be \'\'bw\'\', \'\'gray\'\' or \'\'cmyk\'\'.\');
    end
   case \'fontmode\'
    fontmode = lower(value);
    if (~strcmp(fontmode,{\'scaled\',\'fixed\'}))
      error(\'FontMode must be \'\'scaled\'\' or \'\'fixed\'\'.\');
    end
   case \'fontsize\'
    fontsize = LocalToNum(value);
    if(~LocalIsPositiveScalar(fontsize))
      error(\'FontSize must be a numeric scalar > 0\');
    end
   case \'fontencoding\'
    fontencoding = lower(value);
    if (~strcmp(fontencoding,{\'latin1\',\'adobe\'}))
      error(\'FontEncoding must be \'\'latin1\'\' or \'\'adobe\'\'.\');
    end
   case \'linemode\'
    linemode = lower(value);
    if (~strcmp(linemode,{\'scaled\',\'fixed\'}))
      error(\'LineMode must be \'\'scaled\'\' or \'\'fixed\'\'.\');
    end
   case \'linewidth\'
    linewidth = LocalToNum(value);
    if(~LocalIsPositiveScalar(linewidth))
      error(\'LineWidth must be a numeric scalar > 0\');
    end
   case \'renderer\'
    renderer = lower(value);
    if (~strcmp(renderer,{\'painters\',\'zbuffer\',\'opengl\'}))
      error(\'Renderer must be \'\'painters\'\', \'\'zbuffer\'\' or \'\'opengl\'\'.\');
    end
   case \'resolution\'
    resolution = LocalToNum(value);
    if ~(isnumeric(value) & (prod(size(value)) == 1) & (value >= 0));
      error(\'Resolution must be a numeric scalar >= 0\');
    end
   otherwise
    error([\'Unrecognized option \' param \'.\']);
  end
end

allLines  = findall(H, \'type\', \'line\');
allText   = findall(H, \'type\', \'text\');
allAxes   = findall(H, \'type\', \'axes\');
allImages = findall(H, \'type\', \'image\');
allLights = findall(H, \'type\', \'light\');
allPatch  = findall(H, \'type\', \'patch\');
allSurf   = findall(H, \'type\', \'surface\');
allRect   = findall(H, \'type\', \'rectangle\');
allFont   = [allText; allAxes];
allColor  = [allLines; allText; allAxes; allLights];
allMarker = [allLines; allPatch; allSurf];
allEdge   = [allPatch; allSurf];
allCData  = [allImages; allPatch; allSurf];

old.objs = {};
old.prop = {};
old.values = {};

% Process format and preview parameter
showPreview = strcmp(format,\'preview\');
if showPreview
  format = \'png\';
  filename = [tempName \'.png\'];
end
if strncmp(format,\'eps\',3) & ~strcmp(preview,\'none\')
  args = {args{:}, [\'-\' preview]};
end

hadError = 0;
try
  % Process size parameters
  paperPos = get(H, \'PaperPosition\');
  old = LocalPushOldData(old, H, \'PaperPosition\', paperPos);
  figureUnits = get(H, \'Units\');
  set(H, \'Units\', get(H,\'PaperUnits\'));
  figurePos = get(H, \'Position\');
  aspectRatio = figurePos(3)/figurePos(4);
  set(H, \'Units\', figureUnits);
  if (width == -1) & (height == -1)
    width = paperPos(3);
    height = paperPos(4);
  elseif (width == -1)
    width = height * aspectRatio;
  elseif (height == -1)
    height = width / aspectRatio;
  end
  set(H, \'PaperPosition\', [0 0 width height]);
  paperPosMode = get(H, \'PaperPositionMode\');
  old = LocalPushOldData(old, H, \'PaperPositionMode\', paperPosMode);
  set(H, \'PaperPositionMode\', \'manual\');

  % Process rendering parameters
  switch (color)
   case {\'bw\', \'gray\'}
    if ~strcmp(color,\'bw\') & strncmp(format,\'eps\',3)
      format = [format \'c\'];
    end
    args = {args{:}, [\'-d\' format]};

    %compute and set gray colormap
    oldcmap = get(H,\'Colormap\');
    newgrays = 0.30*oldcmap(:,1) + 0.59*oldcmap(:,2) + 0.11*oldcmap(:,3);
    newcmap = [newgrays newgrays newgrays];
    old = LocalPushOldData(old, H, \'Colormap\', oldcmap);
    set(H, \'Colormap\', newcmap);

    %compute and set ColorSpec and CData properties
    old = LocalUpdateColors(allColor, \'color\', old);
    old = LocalUpdateColors(allAxes, \'xcolor\', old);
    old = LocalUpdateColors(allAxes, \'ycolor\', old);
    old = LocalUpdateColors(allAxes, \'zcolor\', old);
    old = LocalUpdateColors(allMarker, \'MarkerEdgeColor\', old);
    old = LocalUpdateColors(allMarker, \'MarkerFaceColor\', old);
    old = LocalUpdateColors(allEdge, \'EdgeColor\', old);
    old = LocalUpdateColors(allEdge, \'FaceColor\', old);
    old = LocalUpdateColors(allCData, \'CData\', old);

   case \'cmyk\'
    if strncmp(format,\'eps\',3)
      format = [format \'c\'];
      args = {args{:}, [\'-d\' format], \'-cmyk\'};
    else
      args = {args{:}, [\'-d\' format]};
    end
   otherwise
    error(\'Invalid Color parameter\');
  end
  if (~isempty(renderer))
    args = {args{:}, [\'-\' renderer]};
  end
  if (~isempty(resolution)) | ~strncmp(format,\'eps\',3)
    if isempty(resolution)
      resolution = 0;
    end
    args = {args{:}, [\'-r\' int2str(resolution)]};
  end

  % Process font parameters
  if (~isempty(fontmode))
    oldfonts = LocalGetAsCell(allFont,\'FontSize\');
    switch (fontmode)
     case \'fixed\'
      oldfontunits = LocalGetAsCell(allFont,\'FontUnits\');
      old = LocalPushOldData(old, allFont, {\'FontUnits\'}, oldfontunits);
      set(allFont,\'FontUnits\',\'points\');
      if (fontsize == -1)
    set(allFont,\'FontSize\',7);
      else
    set(allFont,\'FontSize\',fontsize);
      end
     case \'scaled\'
      if (fontsize == -1)
    wscale = width/figurePos(3);
    hscale = height/figurePos(4);
    scale = min(wscale, hscale);
      else
    scale = fontsize;
      end
      newfonts = LocalScale(oldfonts,scale,5);
      set(allFont,{\'FontSize\'},newfonts);
     otherwise
      error(\'Invalid FontMode parameter\');
    end
    % make sure we push the size after the units
    old = LocalPushOldData(old, allFont, {\'FontSize\'}, oldfonts);
  end
  if strcmp(fontencoding,\'adobe\') & strncmp(format,\'eps\',3)
    args = {args{:}, \'-adobecset\'};
  end

  % Process linewidth parameters
  if (~isempty(linemode))
    oldlines = LocalGetAsCell(allMarker,\'LineWidth\');
    old = LocalPushOldData(old, allMarker, {\'LineWidth\'}, oldlines);
    switch (linemode)
     case \'fixed\'
      if (linewidth == -1)
    set(allMarker,\'LineWidth\',1);
      else
    set(allMarker,\'LineWidth\',linewidth);
      end
     case \'scaled\'
      if (linewidth == -1)
    wscale = width/figurePos(3);
    hscale = height/figurePos(4);
    scale = min(wscale, hscale);
      else
    scale = linewidth;
      end
      newlines = LocalScale(oldlines, scale, 0.5);
      set(allMarker,{\'LineWidth\'},newlines);
     otherwise
      error(\'Invalid LineMode parameter\');
    end
  end

  % Export
  print(H, filename, args{:});

catch
  hadError = 1;
end

% Restore figure settings
for n=1:length(old.objs)
  set(old.objs{n}, old.prop{n}, old.values{n});
end

if hadError
  error(deblank(lasterr));
end

% Show preview if requested
if showPreview
  X = imread(filename,\'png\');
  delete(filename);
  f = figure( \'Name\', \'Preview\', ...
          \'Menubar\', \'none\', ...
          \'NumberTitle\', \'off\', ...
          \'Visible\', \'off\');
  image(X);
  axis image;
  ax = findobj(f, \'type\', \'axes\');
  set(ax, \'Units\', get(H,\'PaperUnits\'), ...
      \'Position\', [0 0 width height], ...
      \'Visible\', \'off\');
  set(ax, \'Units\', \'pixels\');
  axesPos = get(ax,\'Position\');
  figPos = get(f,\'Position\');
  rootSize = get(0,\'ScreenSize\');
  figPos(3:4) = axesPos(3:4);
  if figPos(1) + figPos(3) > rootSize(3)
    figPos(1) = rootSize(3) - figPos(3) - 50;
  end
  if figPos(2) + figPos(4) > rootSize(4)
    figPos(2) = rootSize(4) - figPos(4) - 50;
  end
  set(f, \'Position\',figPos, ...
     \'Visible\', \'on\');
end

%
%  Local Functions
%

function outData = LocalPushOldData(inData, objs, prop, values)
outData.objs = {inData.objs{:}, objs};
outData.prop = {inData.prop{:}, prop};
outData.values = {inData.values{:}, values};

function cellArray = LocalGetAsCell(fig,prop);
cellArray = get(fig,prop);
if (~isempty(cellArray)) & (~iscell(cellArray))
  cellArray = {cellArray};
end

function newArray = LocalScale(inArray, scale, minValue)
n = length(inArray);
newArray = cell(n,1);
for k=1:n
  newArray{k} = max(minValue,scale*inArray{k}(1));
end

function newArray = LocalMapToGray(inArray);
n = length(inArray);
newArray = cell(n,1);
for k=1:n
  color = inArray{k};
  if (~isempty(color))
    if ischar(color)
      switch color(1)
       case \'y\'
    color = [1 1 0];
       case \'m\'
    color = [1 0 1];
       case \'c\'
    color = [0 1 1];
       case \'r\'
    color = [1 0 0];
       case \'g\'
    color = [0 1 0];
       case \'b\'
    color = [0 0 1];
       case \'w\'
    color = [1 1 1];
       case \'k\'
    color = [0 0 0];
       otherwise
    newArray{k} = color;
      end
    end
    if ~ischar(color)
      color = 0.30*color(1) + 0.59*color(2) + 0.11*color(3);
    end
  end
  if isempty(color) | ischar(color)
    newArray{k} = color;
  else
    newArray{k} = [color color color];
  end
end

function newArray = LocalMapCData(inArray);
n = length(inArray);
newArray = cell(n,1);
for k=1:n
  color = inArray{k};
  if (ndims(color) == 3) & isa(color,\'double\')
    gray = 0.30*color(:,:,1) + 0.59*color(:,:,2) + 0.11*color(:,:,3);
    color(:,:,1) = gray;
    color(:,:,2) = gray;
    color(:,:,3) = gray;
  end
  newArray{k} = color;
end

function outData = LocalUpdateColors(inArray, prop, inData)
value = LocalGetAsCell(inArray,prop);
outData.objs = {inData.objs{:}, inArray};
outData.prop = {inData.prop{:}, {prop}};
outData.values = {inData.values{:}, value};
if (~isempty(value))
  if strcmp(prop,\'CData\') 
    value = LocalMapCData(value);
  else
    value = LocalMapToGray(value);
  end
  set(inArray,{prop},value);
end

function bool = LocalIsPositiveScalar(value)
bool = isnumeric(value) & ...
       prod(size(value)) == 1 & ...
       value > 0;

function value = LocalToNum(value)
if ischar(value)
  value = str2num(value);
end

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap