Mercurial > octave-libtiff
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 |
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 | 3 ## |
4 ## This file is part of Octave. | |
5 ## | |
6 ## Octave is free software; you can redistribute it and/or modify it | |
7 ## under the terms of the GNU General Public License as published by | |
8 ## the Free Software Foundation; either version 3 of the License, or (at | |
9 ## your option) any later version. | |
10 ## | |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 ## General Public License for more details. | |
15 ## | |
16 ## You should have received a copy of the GNU General Public License | |
17 ## along with Octave; see the file COPYING. If not, see | |
18 ## <http://www.gnu.org/licenses/>. | |
19 | |
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 | 25 ## Write images in various file formats. |
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 | 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 | 41 ## |
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 | 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 | 67 ## @end table |
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 | 70 ## @end deftypefn |
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 | 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 | 92 |
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) |