Mercurial > octave-libtiff
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 |
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 |