annotate scripts/image/private/__tiff_imwrite__.m @ 31198:93eb0d6e7f62

__tiff_imwrite__: converted to private octave function * libinterp/corefcn/__tiff__.cc: removed internal function __tiff_imwrite__. * scripts/image/private/__tiff_imwrite__.m: added private function __tiff_imwrite__. * scripts/image/module.mk: added entry for __tiff_imwrite__.m.
author magedrifaat <magedrifaat@gmail.com>
date Fri, 02 Sep 2022 03:06:29 +0200
parents
children 30b28458bb06
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31198
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1 function __tiff_imwrite__ (img, varargin)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2 ## A lot of the input sanitising logic here is copied from
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
3 ## scripts/image/__imwrite__.m and adapted to the needs of the Tiff
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
4 ## interface
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
5
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
6 if (nargin < 2 || ! (isnumeric (img) || islogical (img)))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
7 print_usage ("imwrite");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
8 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
9
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
10 [filename, ext, map, param_list] = imwrite_filename (varargin{:});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
11
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
12 if (isempty (img))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
13 error ("imwrite: invalid empty image");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
14 elseif (issparse (img) || issparse (map))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
15 error ("imwrite: sparse images are not supported");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
16 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
17
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
18 if (rem (numel (param_list), 2) != 0)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
19 error ("imwrite: no pair for all arguments (odd number left)");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
20 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
21
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
22 writemode = "w";
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
23 compression = Tiff.Compression.None;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
24 rows_per_strip = -1;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
25 res = [72, 72];
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
26 description = "";
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
27 alpha = [];
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
28
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
29 for idx = 1:2:numel (param_list)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
30 switch (tolower (param_list{idx}))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
31 case "alpha"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
32 alpha = param_list{idx + 1};
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
33 if (! isnumeric (alpha))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
34 error ("imwrite: value for %s option must be a numeric matrix",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
35 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
36 elseif (size (alpha, 3) != 1)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
37 error ("imwrite: 3rd dimension of matrix for %s must be singleton",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
38 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
39 elseif (ndims (alpha) > 4
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
40 || any (size (alpha)([1 2]) != size (img)([1 2]))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
41 || size (alpha, 4) != size (img, 4))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
42 error ("imwrite: matrix for %s must have same dimension as image",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
43 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
44 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
45
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
46 case "colorspace"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
47 ## Matlab specifies three colorspaces: RGB, CIELAB and ICCLAB.
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
48 ## Of the three, only RGB is currently supported so this tag
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
49 ## can be ignored.
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
50
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
51 case "compression"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
52 switch (tolower (param_list{idx + 1}))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
53 case "packbits"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
54 compression = Tiff.Compression.PackBits;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
55 case "lzw"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
56 compression = Tiff.Compression.LZW;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
57 case "deflate"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
58 compression = Tiff.Compression.Deflate;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
59 case "jpeg"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
60 compression = Tiff.Compression.JPEG;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
61 case "ccitt"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
62 compression = Tiff.Compression.CCITTRLE;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
63 case "fax3"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
64 compression = Tiff.Compression.CCITTFax3;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
65 case "fax4"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
66 compression = Tiff.Compression.CCITTFax4;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
67 otherwise
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
68 error ("imwrite: invalid compression '%s'", compression);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
69 endswitch
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
70
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
71 case "description"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
72 if (! ischar (param_list{idx + 1}))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
73 error ("imwrite: value for %s option must be a string",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
74 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
75 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
76 description = param_list{idx + 1};
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
77
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
78 case "resolution"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
79 if (! isnumeric (param_list{idx + 1})
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
80 || all (numel (param_list) != [1, 2]))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
81 error ("imwrite: value for %s option must be either a scalar value or a two-element vector",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
82 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
83 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
84 resolution = param_list{idx + 1};
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
85 if (numel (resolution) == 1)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
86 resolution(2) = resolution(1);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
87 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
88
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
89 case "rowsperstrip"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
90 if (! isnumeric (param_list{idx + 1})
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
91 || ! isscalar (param_list{idx + 1}))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
92 error ("imwrite: value for %s option must be a numeric scalar",
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
93 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
94 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
95 rows_per_strip = param_list{idx + 1};
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
96
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
97 case "writemode"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
98 if (! ischar (param_list{idx + 1})
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
99 || ! any (strcmpi (param_list{idx + 1}, {"append", "overwrite"})))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
100 error ('imwrite: value for %s option must be "append" or "overwrite"',
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
101 param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
102 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
103 if (strcmpi (param_list{idx + 1}, {"append"}))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
104 writemode = "a";
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
105 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
106
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
107 otherwise
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
108 error ("imwrite: invalid PARAMETER '%s'", param_list{idx});
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
109 endswitch
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
110 endfor
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
111
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
112 if (! isempty (map))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
113 if (! iscolormap (map))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
114 error ("imwrite: invalid MAP for indexed image");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
115 elseif (ndims (img) != 2)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
116 error ("imwrite: indexed image must have 2 (found %i)", ndims (img));
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
117 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
118
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
119 ## If the image is floating point, then we convert it to integer because
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
120 ## it represents indices of the color map which must be integers. Also,
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
121 ## if it's floating point, it has an offset of 1
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
122 if (isfloat (img))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
123 if (rows (map) <= 256)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
124 img = uint8 (img - 1);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
125 else
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
126 img = uint16 (img - 1);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
127 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
128 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
129
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
130 ## Fill in the colormap as required with rgb (0, 0, 0)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
131 nColors = rows (map);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
132 if (islogical (img))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
133 required_colors = 2;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
134 else
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
135 required_colors = double (intmax (class (img))) + 1;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
136 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
137
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
138 if (nColors < required_colors)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
139 warning ("imwrite: MAP has not enough colors. Filling with black");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
140 map(nColors+1:required_colors,:) = 0;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
141 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
142 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
143
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
144 if (ndims (img) > 4)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
145 error ("imwrite: invalid %d-dimensional image data", ndims (img));
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
146 elseif (all (size (img, 3) != [1 3 4]))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
147 ## 1, 3, or 4 for grayscle, RGB, and CMYK respectively
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
148 error ("imwrite: IMG 3rd dimension must be 1, 3, or 4");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
149 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
150
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
151 ## Matlab specifies that JPEG compression must also specify RowsPerStrip
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
152 ## and must be a value divisible by 8
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
153 if (compression == Tiff.Compression.JPEG
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
154 && (rows_per_strip == -1 || rem (rows_per_strip, 8) != 0))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
155 error ("imwrite: RowsPerStrip option must be specified for jpeg compression and must be divisible by 8");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
156 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
157
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
158 ## These compression schemes are only available for binary images
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
159 if (! (islogical (img))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
160 && any (compression == [Tiff.Compression.CCITTRLE,
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
161 Tiff.Compression.CCITTFax3,
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
162 Tiff.Compression.CCITTFax4]))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
163 error ("imwrite: the specified compression scheme is for binary images only");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
164 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
165
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
166 ## Set the image tag data
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
167 tags.ImageLength = size (img, 1);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
168 tags.ImageWidth = size (img, 2);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
169
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
170 ## See if SamplesPerPixel should account for the alpha channel
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
171 if (! isempty (alpha))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
172 tags.SamplesPerPixel = size (img, 3) + 1;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
173 tags.ExtraSamples = Tiff.ExtraSamples.AssociatedAlpha;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
174 else
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
175 tags.SamplesPerPixel = size (img, 3);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
176 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
177
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
178 tags.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
179 tags.Compression = compression;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
180 tags.XResolution = res(1);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
181 tags.YResolution = res(2);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
182 tags.ImageDescription = description;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
183 tags.BitsPerSample = infer_bitdepth (class (img));
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
184
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
185 ## Infer the photometric interpretation of the image from the color map
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
186 ## and the number of channels of the input
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
187 tags.Photometric = Tiff.Photometric.MinIsBlack;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
188 if (! isempty (map))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
189 tags.Photometric = Tiff.Photometric.Palette;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
190 tags.ColorMap = map;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
191 elseif (size(img, 3) == 3)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
192 tags.Photometric = Tiff.Photometric.RGB;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
193 elseif (size(img, 3) == 4)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
194 tags.Photometric = Tiff.Photometric.CMYK;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
195 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
196
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
197 ## Set the correct sample format for floating-point and signed types
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
198 if (isfloat (img))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
199 tags.SampleFormat = Tiff.SampleFormat.IEEEFP;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
200 elseif (any (strcmp (class (img), {"int8", "int16", "int32"})))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
201 tags.SampleFormat = Tiff.SampleFormat.Int;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
202 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
203
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
204 ## Add the alpha channel to the image data
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
205 if (! isempty (alpha))
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
206 img = cat (3, img, alpha);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
207 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
208
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
209 tif = Tiff (filename, writemode);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
210
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
211 for dir_idx = 1:size(img, 4)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
212 tif.setTag (tags);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
213 ## Try to get a reasonable size for RowsPerStrip if not set
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
214 ## This must be done after the other tags are set so LibTIFF
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
215 ## can make an informed calculation.
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
216 % if (rows_per_strip == -1)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
217 % rows_per_strip = tif.getDefaultStripLength ();
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
218 % endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
219 if (rows_per_strip != -1)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
220 tif.setTag (Tiff.TagID.RowsPerStrip, rows_per_strip);
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
221 endif
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
222
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
223 tif.write (img(:,:,:, dir_idx));
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
224
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
225 tif.writeDirectory ();
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
226 endfor
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
227
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
228 tif.close ();
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
229
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
230 endfunction
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
231
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
232 function bitdepth = infer_bitdepth (img_class)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
233 switch (img_class)
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
234 case "logical"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
235 bitdepth = 1;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
236 case {"int8", "uint8"}
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
237 bitdepth = 8;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
238 case {"int16", "uint16"}
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
239 bitdepth = 16;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
240 case {"int32", "uint32", "single"}
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
241 bitdepth = 32;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
242 case "double"
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
243 bitdepth = 64;
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
244 otherwise
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
245 error ("imwrite: Unsupported data type for image data");
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
246 endswitch
93eb0d6e7f62 __tiff_imwrite__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
247 endfunction