[Index for tmp_for_tar/vrml.doc] [Return to Master Index]

saveimage

(tmp_for_tar/vrml.doc/saveimage.m)


Function Synopsis

saveimage (filename, img, img_form, map)

Help text



 along with Octave; see the file COPYING.  If not, write to the Free

 02111-1307, USA.

 -*- texinfo -*-
 @deftypefn {Function File} {} saveimage (@var{file}, @var{x}, @var{fmt}, @var{map})
 Save the matrix @var{x} to @var{file} in image format @var{fmt}.  Valid
 values for @var{fmt} are

 @table @code
 @item "img"
 Octave's image format.  The current colormap is also saved in the file.

 @item "ppm"
 Portable pixmap format.

 @item "ps"
 PostScript format.  Note that images saved in PostScript format can not
 be read back into Octave with loadimage.
 @end table

 If the fourth argument is supplied, the specified colormap will also be
 saved along with the image.

 Note: if the colormap contains only two entries and these entries are
 black and white, the bitmap ppm and PostScript formats are used.  If the
 image is a gray scale image (the entries within each row of the colormap
 are equal) the gray scale ppm and PostScript image formats are used,
 otherwise the full color formats are used.
 @end deftypefn

 The conversion to PostScript is based on pbmtolps.c, which was
 written by

   George Phillips <phillips@cs.ubc.ca>
   Department of Computer Science
   University of British Columbia

 and is part of the portable bitmap utilities,
 @seealso{loadimage, save, load, and colormap}

 Created: July 1994
 Adapted-By: jwe

 Rewritten by jwe to avoid using octoppm and pbm routines so that
 people who don't have the the pbm stuff installed can still use this
 function.

 The conversion to PostScript is based on pnmtops.c, which is part of

 Permission to use, copy, modify, and distribute this software and its
 documentation for any purpose and without fee is hereby granted, provided

 documentation.  This software is provided "as is" without express or
 implied warranty.



Listing of function file tmp_for_tar/vrml.doc/saveimage.m

## Copyright (C) 1996, 1997 John W. Eaton
##
## This file is part of Octave.
##
## Octave is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version.
##
## Octave is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, write to the Free
## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
## 02111-1307, USA.

## -*- texinfo -*-
## @deftypefn {Function File} {} saveimage (@var{file}, @var{x}, @var{fmt}, @var{map})
## Save the matrix @var{x} to @var{file} in image format @var{fmt}.  Valid
## values for @var{fmt} are
##
## @table @code
## @item "img"
## Octave's image format.  The current colormap is also saved in the file.
##
## @item "ppm"
## Portable pixmap format.
##
## @item "ps"
## PostScript format.  Note that images saved in PostScript format can not
## be read back into Octave with loadimage.
## @end table
##
## If the fourth argument is supplied, the specified colormap will also be
## saved along with the image.
##
## Note: if the colormap contains only two entries and these entries are
## black and white, the bitmap ppm and PostScript formats are used.  If the
## image is a gray scale image (the entries within each row of the colormap
## are equal) the gray scale ppm and PostScript image formats are used,
## otherwise the full color formats are used.
## @end deftypefn

## The conversion to PostScript is based on pbmtolps.c, which was
## written by
##
##   George Phillips <phillips@cs.ubc.ca>
##   Department of Computer Science
##   University of British Columbia
##
## and is part of the portable bitmap utilities,
## @seealso{loadimage, save, load, and colormap}

## Author: Tony Richardson <arichard@stark.cc.oh.us>
## Created: July 1994
## Adapted-By: jwe

## Rewritten by jwe to avoid using octoppm and pbm routines so that
## people who don't have the the pbm stuff installed can still use this
## function.
##
## The conversion to PostScript is based on pnmtops.c, which is part of
## the portable bitmap utilties and bears this copyright notice:
##
## Copyright (C) 1989 by Jef Poskanzer.
##
## Permission to use, copy, modify, and distribute this software and its
## documentation for any purpose and without fee is hereby granted, provided
## that the above copyright notice appear in all copies and that both that
## copyright notice and this permission notice appear in supporting
## documentation.  This software is provided "as is" without express or
## implied warranty.

function saveimage (filename, img, img_form, map)
  
  if (nargin < 2 || nargin > 4)
    usage ("saveimage (filename, matrix, [format, [colormap]])");
  endif

  if (nargin < 4)
    map = colormap ();
 endif

  [map_nr, map_nc] = size (map);

  if (map_nc != 3)
    error ("colormap should be an N x 3 matrix");
  endif

  if (nargin < 3)
    img_form = "img";
  elseif (! isstr (img_form))
    error ("image format specification must be a string");
  elseif (! (strcmp (img_form, "img")
             || strcmp (img_form, "ppm")
             || strcmp (img_form, "ps")))
    error ("unsupported image format specification");
  endif

  if (! is_matrix (img))
    warning ("image variable is not a matrix");
  endif

  if (! isstr (filename))
    error ("file name must be a string");
  endif

  ## If we just want Octave image format, save and return.

  if (strcmp (img_form, "img"))
    eval (strcat ("save -ascii ", filename, " map img"));
    return;
  endif

  ## Convert to another format if requested.

  grey = all (map(:,1) == map(:,2) && map(:,1) == map (:,3));

  pbm = pgm = ppm = 0;

  map_sz = map_nr * map_nc;

  map = reshape (map, map_sz, 1);

  idx = find (map > 1);
  map (idx) = ones (size (idx));

  idx = find (map < 0);
  map (idx) = zeros (size (idx));

  map = round (255 * map);

  bw = (map_nr == 2
        && ((map(1,1) == 0 && map(2,1) == 255)
            || (map(1,1) == 255 && map(2,1) == 0)));

  img = round (img');
  [img_nr, img_nc] = size (img);

  img_sz = img_nr * img_nc;
  img = reshape (img, img_sz, 1);

  idx = find (img > map_nr);
  img (idx) = ones (size (idx)) * map_nr;

  idx = find (img <= 0);
  img (idx) = ones (size (idx));
  
  if (strcmp (img_form, "ppm"))

    ## Would be nice to make this consistent with the line used by the
    ## load/save functions, but we need a good way to get username and
    ## hostname information.

    time_string = ctime (time ());
    time_string = time_string (1:length (time_string)-1);
    tagline = sprintf ("# Created by Octave %s, %s",
		       __OCTAVE_VERSION__, time_string);

    if (grey && map_nr == 2 && bw)

      if (map(1) != 0)
        map = [0; 1];
      else
        map = [1; 0];
      endif

      n_long = rem (img_nc, 8);
      tmp = zeros (ceil (img_nc/8), img_nr);

      for i = 1:img_nr
        idx = (i-1)*img_nc+1:i*img_nc;
        if (n_long > 0)
          img_row = [map(img(idx)); (zeros (8-n_long, 1))];
        else
          img_row = map(img(idx));
        endif
	l_img_row = length (img_row);
        if (img_nc < 8)
          for j = 1:8
            tmp(:,i) = tmp(:,i) + img_row (j) * 2^(8-j);
          endfor
        else
          for j = 1:8
            tmp(:,i) = tmp(:,i) + img_row (j:8:l_img_row) * 2^(8-j);
          endfor
        endif
      endfor

      fid = fopen (filename, "w");
      fprintf (fid, "P4\n%s\n%d %d\n", tagline, img_nr, img_nc);
      fwrite (fid, tmp, "char");
      fprintf (fid, "\n");
      fclose (fid);

    elseif (grey)

      fid = fopen (filename, "w");
      fprintf (fid, "P5\n%s\n%d %d\n255\n", tagline, img_nr, img_nc);
      fwrite (fid, map(img), "uchar");
      fprintf (fid, "\n");
      fclose (fid);

    else

      img_idx = ((1:3:3*img_sz)+2)';
      map_idx = ((2*map_nr+1):map_sz)';

      tmap = map(map_idx);
      tmp(img_idx--) = tmap(img);

      map_idx = map_idx - map_nr;
      tmap = map(map_idx);
      tmp(img_idx--) = tmap(img);

      map_idx = map_idx - map_nr;
      tmap = map(map_idx);
      tmp(img_idx--) = tmap(img);

      fid = fopen (filename, "w");
      fprintf (fid, "P6\n%s\n%d %d\n255\n", tagline, img_nr, img_nc);
      fwrite (fid, tmp, "uchar");
      fprintf (fid, "\n");
      fclose (fid);

    endif

  elseif (strcmp (img_form, "ps") == 1)

    if (! grey)
      error ("must have a greyscale color map for conversion to PostScript");
    endif

    bps = 8;
    dpi = 300;
    pagewid = 612;
    pagehgt = 762;
    MARGIN = 0.95;
    devpix = dpi / 72.0 + 0.5;
    pixfac = 72.0 / dpi * devpix;

    ## Compute padding to round cols * bps up to the nearest multiple of 8
    ## (nr and nc are switched because we transposed the image above).

    padright = (((img_nr * bps + 7) / 8) * 8 - img_nr * bps) / bps;

    scols = img_nr * pixfac;
    srows = img_nc * pixfac;
    scale = 1;

    if (scols > pagewid * MARGIN || srows > pagehgt * MARGIN)
      if (scols > pagewid * MARGIN)
        scale = scale * (pagewid / scols * MARGIN);
        scols = scale * img_nr * pixfac;
        srows = scale * img_nc * pixfac;
      endif
      if (srows > pagehgt * MARGIN)
        scale = scale * (pagehgt / srows * MARGIN);
        scols = scale * img_nr * pixfac;
        srows = scale * img_nc * pixfac;
      endif
      warning ("image too large for page, rescaling to %g", scale);
    endif

    llx = (pagewid - scols) / 2;
    lly = (pagehgt - srows) / 2;
    urx = llx + fix (scols + 0.5);
    ury = lly + fix (srows + 0.5);

    fid = fopen (filename, "w");

    fprintf (fid, "%%!PS-Adobe-2.0 EPSF-2.0\n");
    fprintf (fid, "%%%%Creator: Octave %s (saveimage.m)\n", OCTAVE_VERSION);
    fprintf (fid, "%%%%Title: %s\n", filename);
    fprintf (fid, "%%%%Pages: 1\n");
    fprintf (fid, "%%%%BoundingBox: %d %d %d %d\n",
             fix (llx), fix (lly), fix (urx), fix (ury));
    fprintf (fid, "%%%%EndComments\n");
    fprintf (fid, "/readstring {\n");
    fprintf (fid, "  currentfile exch readhexstring pop\n");
    fprintf (fid, "} bind def\n");
    fprintf (fid, "/picstr %d string def\n",
             fix ((img_nr + padright) * bps / 8));
    fprintf (fid, "%%%%EndProlog\n");
    fprintf (fid, "%%%%Page: 1 1\n");
    fprintf (fid, "gsave\n");
    fprintf (fid, "%g %g translate\n", llx, lly);
    fprintf (fid, "%g %g scale\n", scols, srows);
    fprintf (fid, "%d %d %d\n", img_nr, img_nc, bps);
    fprintf (fid, "[ %d 0 0 -%d 0 %d ]\n", img_nr, img_nc, img_nc);
    fprintf (fid, "{ picstr readstring }\n");
    fprintf (fid, "image\n");

    img = map(img);

    fmt = "%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n";
    fprintf (fid, fmt, img);

    if (rem (img_sz, 30) != 0)
      fprintf (fid, "\n");
    endif

    fprintf (fid, "grestore\n");
    fprintf (fid, "showpage\n");
    fprintf (fid, "%%%%Trailer\n");
    fclose (fid);

  else
    error ("saveimage: what happened to the image type?");
  endif

endfunction

Produced by oct2html on Sat Dec 2 19:08:39 2000
Cross-Directory links are: ON