diff scripts/image/private/__imwrite__.m @ 17086:3db796f89695

Rename private core_imfnc functions to follow the __fnc__ convention style.
author Carnë Draug <carandraug@octave.org>
date Fri, 26 Jul 2013 00:47:23 +0100
parents scripts/image/private/core_imwrite.m@54b75bed4bc7
children abf384f5d243
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/image/private/__imwrite__.m	Fri Jul 26 00:47:23 2013 +0100
@@ -0,0 +1,105 @@
+## Copyright (C) 2008-2012 John W. Eaton
+## Copyright (C) 2013 Carnë Draug
+##
+## 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 3 of the License, 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, see
+## <http://www.gnu.org/licenses/>.
+
+## This function does all the work of imwrite. It exists here as private
+## function so that imwrite can use other functions if imformats is
+## configured to. It is also needed so that imformats can create a
+## function handle for it.
+
+function __imwrite__ (img, varargin)
+
+  if (nargin < 2 || ! (isnumeric (img) || islogical (img)))
+    print_usage ("imwrite");
+  endif
+
+  [filename, ext, map, param_list] = imwrite_filename (varargin{:});
+
+  if (rem (numel (param_list), 2) != 0)
+    error ("imwrite: no pair for all arguments (even number left)");
+  endif
+
+  ## set default for options
+  options        = struct ("writemode", "overwrite",
+                           "quality",   75);
+
+  for idx = 1:2:numel (param_list)
+
+    switch (tolower (param_list{idx}))
+
+      case "writemode",
+        options.writemode = param_list{idx+1};
+        if (! ischar (options.writemode) ||
+            ! any (strcmpi (options.writemode, {"append", "overwrite"})))
+          error ("imwrite: value for %s option must be \"append\" or \"overwrite\"",
+                 param_list{idx});
+        endif
+        options.writemode = tolower (options.writemode);
+
+      case "quality",
+        options.quality = param_list{idx+1};
+        if (! isnumeric (options.quality) || ! isscalar (options.quality) ||
+            options.quality < 0 || options.quality > 100)
+          error ("imwrite: value for %s option must be a scalar between 0 and 100",
+                 param_list{idx});
+        endif
+        options.quality = round (options.quality);
+
+      otherwise
+        error ("imwrite: invalid PARAMETER `%s'", varargin{idx});
+
+    endswitch
+  endfor
+
+  if (isempty (img))
+    error ("imwrite: invalid empty image");
+  elseif (issparse (img) || issparse (map))
+    error ("imwrite: sparse images not supported");
+  endif
+
+  if (! isempty (map))
+    if (! iscolormap (map))
+      error ("imwrite: invalid MAP for indexed image");
+    elseif (ndims (img) != 2 && ndims (img) != 4)
+      error ("imwrite: indexed image must have 2 or 4 dimensions (found %i)", ndims (img));
+    endif
+    ## FIXME: we should really be writing indexed images but that needs
+    ##        to be implemented in  __magick_write__(). So we convert
+    ##        them to RGB and write them "normally".
+    warned = false;
+    if (! warned)
+      warning ("imwrite: saving of indexed images is not yet implemented. Will save a RGB image.");
+      warned = true;
+    endif
+    img = ind2rgb (img, map);
+    map = [];
+  endif
+
+  if (ndims (img) > 4)
+    error ("imwrite: invalid %d-dimensional image data", ndims (img));
+  elseif (all (size (img, 3) != [1 3]))
+    ## This test needs to be adjusted if one day we implement alternative
+    ## colorspaces. In the mean time, we only have grayscale and RGB images,
+    ## but CMYK means length 4 in the 3rd dimension.
+    error ("imwrite: IMG 3rd dimension must be 1 or 3");
+  endif
+
+  ## FIXME: do we need to convert the image class?
+  __magick_write__ (filename, ext, img, map, options);
+
+endfunction