annotate scripts/image/imwrite.m @ 17332:eb7e9a991ffb

Implement writing of CMYK and fix writing of image alpha channel (bug #32986). * __magick_read__.cc (bitdepth_from_class, init_encode_image): new functions created from pieces of encode_indexed_images () to be used by the other encode image functions. (encode_indexed_images): make use of new bitdepth_from_class(), and init_encode_image() functions. (encode_bool_image): rewritten to match flow of the other encode functions, use fortran_vec for performance, and use only 4th dimension for frames. (encode_uint_image): completely rewritten to identify images of CMYK type and not confuse them with RGB plus alpha channel. Now accepts the alpha channel as separate argument. Image argument must now be of same class as the template. (__magick_write__): changed to match new API for the encode functions. * private/__imwrite__.m: set default and input check for alpha channel option. * imwrite.m: document alpha channel option as separate argument. * NEWS: announce rewrite of the image IO functions and warn about possible backwards incompatibilities.
author Carnë Draug <carandraug@octave.org>
date Mon, 19 Aug 2013 16:11:18 +0100
parents bc924baa2c4e
children 1c89599167a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14138
72c96de7a403 maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents: 11591
diff changeset
1 ## Copyright (C) 2008-2012 John W. Eaton
16948
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
2 ## Copyright (C) 2013 Carnë Draug
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3 ##
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4 ## This file is part of Octave.
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5 ##
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
7 ## under the terms of the GNU General Public License as published by
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
9 ## your option) any later version.
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
10 ##
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
14 ## General Public License for more details.
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
15 ##
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
18 ## <http://www.gnu.org/licenses/>.
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
19
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
20 ## -*- texinfo -*-
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
21 ## @deftypefn {Function File} {} imwrite (@var{img}, @var{filename})
16944
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
22 ## @deftypefnx {Function File} {} imwrite (@var{img}, @var{filename}, @var{ext})
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
23 ## @deftypefnx {Function File} {} imwrite (@var{img}, @var{map}, @var{filename})
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
24 ## @deftypefnx {Function File} {} imwrite (@dots{}, @var{param1}, @var{val1}, @dots{})
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25 ## Write images in various file formats.
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 ##
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
27 ## The image @var{img} can be a binary, grayscale, RGB, or multi-dimensional
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
28 ## image. The size and class of @var{img} should be the same as what should
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
29 ## be expected when reading it with @code{imread}: the 3rd and 4th dimensions
17171
c3bd7314643c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 17170
diff changeset
30 ## reserved for color space, and multiple pages respectively. If it's an
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
31 ## indexed image, the colormap @var{map} must also be specified.
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
32 ##
16944
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
33 ## If @var{ext} is not supplied, the file extension of @var{filename} is used
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
34 ## to determine the format. The actual supported formats are dependent on
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
35 ## options made during the build of Octave. Use @code{imformats} to check
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
36 ## the support of the different image formats.
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 ##
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
38 ## Depending on the file format, it is possible to configure the writing
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
39 ## of images with @var{param}, @var{val} pairs. The following options
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
40 ## are supported:
8148
213dd524f96b Improve documentation for image I/O.
sh@sh-laptop
parents: 8054
diff changeset
41 ##
213dd524f96b Improve documentation for image I/O.
sh@sh-laptop
parents: 8054
diff changeset
42 ## @table @samp
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
43 ## @item Alpha
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
44 ## Alpha (transparency) channel for the image. This must be a matrix with
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
45 ## same class, and number of rows and columns of @var{img}. In case of a
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
46 ## multipage image, the size of the 4th dimension must also match and the third
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
47 ## dimension must be a singleton. By default, image will be completely
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
48 ## opaque.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17281
diff changeset
49 ##
8148
213dd524f96b Improve documentation for image I/O.
sh@sh-laptop
parents: 8054
diff changeset
50 ## @item Quality
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
51 ## Set the quality of the compression. The value should be an
11587
c792872f8942 all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
52 ## integer between 0 and 100, with larger values indicating higher visual
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
53 ## quality and lower compression. Defaults to 75.
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
54 ##
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
55 ## @item WriteMode
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
56 ## Some file formats, such as TIFF and GIF, are able to store multiple
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
57 ## images in a single file. This option specifies if @var{img} should be
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
58 ## appended to the file (if it exists) or if a new file should be created
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
59 ## for it (possibly overwriting an existing file). The value should be
17281
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 17267
diff changeset
60 ## the string @qcode{"Overwrite"} (default), or @qcode{"Append"}.
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
61 ##
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
62 ## Despite this option, the most efficient method of writing a multipage
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
63 ## image is to pass a 4 dimensional @var{img} to @code{imwrite}, the
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
64 ## same matrix that could be expected when using @code{imread} with the
17281
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 17267
diff changeset
65 ## option @qcode{"Index"} set to @qcode{"all"}.
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16948
diff changeset
66 ##
8148
213dd524f96b Improve documentation for image I/O.
sh@sh-laptop
parents: 8054
diff changeset
67 ## @end table
213dd524f96b Improve documentation for image I/O.
sh@sh-laptop
parents: 8054
diff changeset
68 ##
16944
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
69 ## @seealso{imread, imfinfo, imformats}
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70 ## @end deftypefn
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
71
16916
59f575e504dc Connect imwrite with imformats.
Carnë Draug <carandraug@octave.org>
parents: 15714
diff changeset
72 function imwrite (varargin)
59f575e504dc Connect imwrite with imformats.
Carnë Draug <carandraug@octave.org>
parents: 15714
diff changeset
73 if (nargin < 2)
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
74 print_usage ();
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
75 endif
16948
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
76 [filename, ext] = imwrite_filename (varargin{2:end});
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
77
16948
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
78 fmt = imformats (ext);
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
79 ## When there is no match, fmt will be a 1x1 structure with
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
80 ## no fields, so we can't just use `isempty (fmt)'.
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
81 if (isempty (fieldnames (fmt)))
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
82 if (isempty (ext))
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
83 error ("imwrite: no extension found for %s to identify the image format",
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
84 filename);
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
85 endif
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
86 warning ("imwrite: unlisted image format %s (see imformats). Trying to save anyway.",
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
87 ext);
17086
3db796f89695 Rename private core_imfnc functions to follow the __fnc__ convention style.
Carnë Draug <carandraug@octave.org>
parents: 16988
diff changeset
88 __imwrite__ (varargin{:});
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
89 else
16948
ee2166121a28 imwrite: clean up finding of filename and its connection to imformats.
Carnë Draug <carandraug@octave.org>
parents: 16944
diff changeset
90 fmt.write (varargin{:});
16944
1b3b3ee88284 Add optional extension argument to image IO functions.
Carnë Draug <carandraug@octave.org>
parents: 16916
diff changeset
91 endif
7987
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
92
4a423a042971 add imwrite.m
John W. Eaton <jwe@octave.org>
parents:
diff changeset
93 endfunction
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
94
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
95 %% Test input validation
14363
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
96 %!error imwrite () # Wrong # of args
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
97 %!error imwrite (1) # Wrong # of args
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
98 %!error imwrite ({"cell"}, "filename.jpg") # Wrong class for img
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
99 %!error imwrite (1, [], "filename.jpg") # Empty image map
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
100 %!error imwrite (1, 2, 3) # No filename specified
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
101 %!error imwrite (1, "filename") # No fmt specified
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
102 %!error imwrite (1, "filename", "junk") # Invalid fmt specified
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
103 %!error imwrite ([], "filename.jpg") # Empty img matrix
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
104 %!error imwrite (spones (2), "filename.jpg") # Invalid sparse img
10891
ff94219746bd imwrite.m: Allow writing of 1-bit (B&W) images.
Rik <octave@nomad.inbox5.com>
parents: 10793
diff changeset
105
17267
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
106 %!testif HAVE_MAGICK
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
107 %! imw = randi (255, 100, "uint8");
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
108 %! filename = [tmpnam() ".png"];
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
109 %! unwind_protect
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
110 %! imwrite (imw, filename);
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
111 %! imr = imread (filename);
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
112 %! unwind_protect_cleanup
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
113 %! unlink (filename);
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
114 %! end_unwind_protect
27800ef1f7d2 imwrite: add simple test for actual successfully writing
Carnë Draug <carandraug@octave.org>
parents: 17171
diff changeset
115 %! assert (imw, imr)