annotate libinterp/dldfcn/__magick_read__.cc @ 17912:01496d4811b1

imread: deal elegantly with multiples frames of different sizes. * __magick_read__.cc (F__magick_read__): when attempting to read multiple frames of an image file, check that they all have the same dimensions to avoid segfaulting later while trying to access pixels that do not exist.
author Carnë Draug <carandraug@octave.org>
date Wed, 13 Nov 2013 02:49:06 +0000
parents 870f3e12e163
children c7f089c560cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
1 /*
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
2
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
3 Copyright (C) 2013 Carnë Draug
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 17705
diff changeset
4 Copyright (C) 2002-2013 Andy Adler
7932
d75586531aac style fixes
John W. Eaton <jwe@octave.org>
parents: 7931
diff changeset
5 Copyright (C) 2008 Thomas L. Scofield
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
6 Copyright (C) 2010 David Grundberg
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
7
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
8 This file is part of Octave.
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
9
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
10 Octave is free software; you can redistribute it and/or modify it
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
11 under the terms of the GNU General Public License as published by the
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
12 Free Software Foundation; either version 3 of the License, or (at your
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
13 option) any later version.
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
14
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
15 Octave is distributed in the hope that it will be useful, but WITHOUT
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
18 for more details.
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
19
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
20 You should have received a copy of the GNU General Public License
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
21 along with Octave; see the file COPYING. If not, see
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
22 <http://www.gnu.org/licenses/>.
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
23
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
24 */
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
25
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
26 #ifdef HAVE_CONFIG_H
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
27 #include <config.h>
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
28 #endif
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
29
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
30 #include "file-stat.h"
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
31 #include "oct-env.h"
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
32 #include "oct-time.h"
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
33
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
34 #include "defun-dld.h"
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
35 #include "error.h"
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
36 #include "ov-struct.h"
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
37
16925
5c25f7ed080c *__magick_read__.cc: add missing include of gripes.h
Torsten <ttl@justmail.de>
parents: 16901
diff changeset
38 #include "gripes.h"
5c25f7ed080c *__magick_read__.cc: add missing include of gripes.h
Torsten <ttl@justmail.de>
parents: 16901
diff changeset
39
7937
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
40 #ifdef HAVE_MAGICK
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
41
9575
55ecaefb7d0f Use pkg-config to configure GraphicsMagick++.
David Grundberg <individ@acc.umu.se>
parents: 9439
diff changeset
42 #include <Magick++.h>
10739
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
43 #include <clocale>
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
44
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
45 // In theory, it should be enough to check the class:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
46 // Magick::ClassType
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
47 // PseudoClass:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
48 // Image is composed of pixels which specify an index in a color palette.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
49 // DirectClass:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
50 // Image is composed of pixels which represent literal color values.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
51 //
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
52 // GraphicsMagick does not really distinguishes between indexed and
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
53 // normal images. After reading a file, it decides itself the optimal
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
54 // way to store the image in memory, independently of the how the
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
55 // image was stored in the file. That's what ClassType returns. While
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
56 // it seems to match the original file most of the times, this is
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
57 // not necessarily true all the times. See
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
58 // https://sourceforge.net/mailarchive/message.php?msg_id=31180507
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
59 // In addition to the ClassType, there is also ImageType which has a
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
60 // type for indexed images (PaletteType and PaletteMatteType). However,
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
61 // they also don't represent the original image. Not only does DirectClass
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
62 // can have a PaletteType, but also does a PseudoClass have non Palette
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
63 // types.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
64 //
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
65 // We can't do better without having format specific code which is
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
66 // what we are trying to avoid by using a library such as GM. We at
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
67 // least create workarounds for the most common problems.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
68 //
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
69 // 1) A grayscale jpeg image can report being indexed even though the
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
70 // JPEG format has no support for indexed images. We can at least
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
71 // fix this one.
17373
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
72 // 2) A PNG file is only an indexed image if color type orig is 3 (value comes
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
73 // from libpng)
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
74 static bool
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
75 is_indexed (const Magick::Image& img)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
76 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
77 bool retval = false;
17373
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
78 const std::string format = img.magick ();
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
79 if (img.classType () == Magick::PseudoClass
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
80 && format != "JPEG"
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
81 && (format != "PNG"
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
82 || const_cast<Magick::Image&> (img).attribute ("PNG:IHDR.color-type-orig") == "3"))
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
83 retval = true;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
84
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
85 return retval;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
86 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
87
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
88 // The depth from depth() is not always correct for us but seems to be the
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
89 // best value we can get. For example, a grayscale png image with 1 bit
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
90 // per channel should return a depth of 1 but instead we get 8.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
91 // We could check channelDepth() but then, which channel has the data
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
92 // is not straightforward. So we'd have to check all
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
93 // the channels and select the highest value. But then, I also
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
94 // have a 16bit TIFF whose depth returns 16 (correct), but all of the
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
95 // channels gives 8 (wrong). No idea why, maybe a bug in GM?
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
96 // Anyway, using depth() seems that only causes problems for binary
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
97 // images, and the problem with channelDepth() is not making set them
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
98 // all to 1. So we will guess that if all channels have depth of 1,
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
99 // then we must have a binary image.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
100 // Note that we can't use AllChannels it doesn't work for this.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
101 // Instead of checking all of the individual channels, we check one
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
102 // from RGB, CMYK, grayscale, and transparency.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
103 static octave_idx_type
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
104 get_depth (Magick::Image& img)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
105 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
106 octave_idx_type depth = img.depth ();
17373
8508b8ae46a8 imread: fix identification of PNG files as indexed.
Carnë Draug <carandraug@octave.org>
parents: 17372
diff changeset
107 if (depth == 8
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
108 && img.channelDepth (Magick::RedChannel) == 1
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
109 && img.channelDepth (Magick::CyanChannel) == 1
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
110 && img.channelDepth (Magick::OpacityChannel) == 1
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
111 && img.channelDepth (Magick::GrayChannel) == 1)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
112 depth = 1;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
113
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
114 return depth;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
115 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
116
17335
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
117 // We need this in case one of the sides of the image being read has
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
118 // width 1. In those cases, the type will come as scalar instead of range
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
119 // since that's the behaviour of the colon operator (1:1:1 will be a scalar,
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
120 // not a range).
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
121 static Range
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
122 get_region_range (const octave_value& region)
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
123 {
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
124 Range output;
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
125 if (region.is_range ())
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
126 output = region.range_value ();
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
127 else if (region.is_scalar_type ())
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
128 {
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
129 double value = region.scalar_value ();
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
130 output = Range (value, value);
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
131 }
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
132 else
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
133 error ("__magick_read__: unknow datatype for Region option");
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
134
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
135 return output;
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
136 }
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
137
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
138 static std::map<std::string, octave_idx_type>
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
139 calculate_region (const octave_scalar_map& options)
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
140 {
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
141 std::map<std::string, octave_idx_type> region;
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
142 const Cell pixel_region = options.getfield ("region").cell_value ();
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
143
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
144 // Subtract 1 to account for 0 indexing.
17335
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
145 const Range rows = get_region_range (pixel_region (0));
583306fe7e4f Fix reading of images with height or width of 1 pixel.
Carnë Draug <carandraug@octave.org>
parents: 17334
diff changeset
146 const Range cols = get_region_range (pixel_region (1));
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
147 region["row_start"] = rows.base () -1;
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
148 region["col_start"] = cols.base () -1;
17138
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
149 region["row_end"] = rows.max () -1;
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
150 region["col_end"] = cols.max () -1;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
151
17138
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
152 // Length of the area to load into the Image Pixel Cache. We use max and
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
153 // min to account for cases where last element of range is the range limit.
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
154 region["row_cache"] = region["row_end"] - region["row_start"] +1;
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
155 region["col_cache"] = region["col_end"] - region["col_start"] +1;
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
156
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
157 // How much we have to shift in the memory when doing the loops.
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
158 region["row_shift"] = region["col_cache"] * rows.inc ();
17138
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
159 region["col_shift"] = region["col_cache"] *
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
160 (region["row_cache"] + rows.inc () -1) - cols.inc ();
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
161
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
162 // The actual height and width of the output image
17138
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
163 region["row_out"] = rows.nelem ();
96526baf7423 Fix reading of images using PixelRegion with ranges ending before the limit.
Carnë Draug <carandraug@octave.org>
parents: 17134
diff changeset
164 region["col_out"] = cols.nelem ();
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
165
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
166 return region;
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
167 }
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
168
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
169 static octave_value_list
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
170 read_maps (Magick::Image& img)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
171 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
172 // can't call colorMapSize on const Magick::Image
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
173 const octave_idx_type mapsize = img.colorMapSize ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
174 Matrix cmap = Matrix (mapsize, 3); // colormap
17372
63b53ea33a8b imread: fix returning multiple variables.
Carnë Draug <carandraug@octave.org>
parents: 17362
diff changeset
175 ColumnVector amap = ColumnVector (mapsize); // alpha map
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
176 for (octave_idx_type i = 0; i < mapsize; i++)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
177 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
178 const Magick::ColorRGB c = img.colorMap (i);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
179 cmap(i,0) = c.red ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
180 cmap(i,1) = c.green ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
181 cmap(i,2) = c.blue ();
17372
63b53ea33a8b imread: fix returning multiple variables.
Carnë Draug <carandraug@octave.org>
parents: 17362
diff changeset
182 amap(i) = c.alpha ();
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
183 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
184 octave_value_list maps;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
185 maps(0) = cmap;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
186 maps(1) = amap;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
187 return maps;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
188 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
189
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
190 template <class T>
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
191 static octave_value_list
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
192 read_indexed_images (const std::vector<Magick::Image>& imvec,
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
193 const Array<octave_idx_type>& frameidx,
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
194 const octave_idx_type& nargout,
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
195 const octave_scalar_map& options)
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
196 {
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
197 typedef typename T::element_type P;
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
198
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
199 octave_value_list retval (3, Matrix ());
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
200
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
201 std::map<std::string, octave_idx_type> region = calculate_region (options);
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
202 const octave_idx_type nFrames = frameidx.length ();
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
203 const octave_idx_type nRows = region["row_out"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
204 const octave_idx_type nCols = region["col_out"];
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
205
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
206 // imvec has all of the pages of a file, even the ones we are not
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
207 // interested in. We will use the first image that we will be actually
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
208 // reading to get information about the image.
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
209 const octave_idx_type def_elem = frameidx(0);
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
210
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
211 T img = T (dim_vector (nRows, nCols, 1, nFrames));
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
212 P* img_fvec = img.fortran_vec ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
213
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
214 const octave_idx_type row_start = region["row_start"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
215 const octave_idx_type col_start = region["col_start"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
216 const octave_idx_type row_shift = region["row_shift"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
217 const octave_idx_type col_shift = region["col_shift"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
218 const octave_idx_type row_cache = region["row_cache"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
219 const octave_idx_type col_cache = region["col_cache"];
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
220
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
221 // When reading PixelPackets from the Image Pixel Cache, they come in
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
222 // row major order. So we keep moving back and forth there so we can
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
223 // write the image in column major order.
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
224 octave_idx_type idx = 0;
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
225 for (octave_idx_type frame = 0; frame < nFrames; frame++)
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
226 {
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
227 imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
228 col_cache, row_cache);
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
229
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
230 const Magick::IndexPacket *pix
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
231 = imvec[frameidx(frame)].getConstIndexes ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
232
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
233 for (octave_idx_type col = 0; col < nCols; col++)
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
234 {
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
235 for (octave_idx_type row = 0; row < nRows; row++)
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
236 {
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
237 img_fvec[idx++] = static_cast<P> (*pix);
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
238 pix += row_shift;
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
239 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
240 pix -= col_shift;
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
241 }
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
242 }
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
243 retval(0) = octave_value (img);
7933
54e414cc106b style fixes
John W. Eaton <jwe@octave.org>
parents: 7932
diff changeset
244
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
245 // Only bother reading the colormap if it was requested as output.
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
246 if (nargout > 1)
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
247 {
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
248 // In theory, it should be possible for each frame of an image to
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
249 // have different colormaps but for Matlab compatibility, we only
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
250 // return the colormap of the first frame. To obtain the colormaps
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
251 // of different frames, one needs can either use imfinfo or a for
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
252 // loop around imread.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
253 const octave_value_list maps =
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
254 read_maps (const_cast<Magick::Image&> (imvec[frameidx(def_elem)]));
10100
dd4d4b14b340 __magick_read__.cc: no need to explicitly call chop_trailing_singletons now
John W. Eaton <jwe@octave.org>
parents: 9575
diff changeset
255
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
256 retval(1) = maps(0);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
257
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
258 // only interpret alpha channel if it exists and was requested as output
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
259 if (imvec[def_elem].matte () && nargout >= 3)
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
260 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
261 const Matrix amap = maps(1).matrix_value ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
262 const double* amap_fvec = amap.fortran_vec ();
7933
54e414cc106b style fixes
John W. Eaton <jwe@octave.org>
parents: 7932
diff changeset
263
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
264 NDArray alpha (dim_vector (nRows, nCols, 1, nFrames));
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
265 double* alpha_fvec = alpha.fortran_vec ();
7933
54e414cc106b style fixes
John W. Eaton <jwe@octave.org>
parents: 7932
diff changeset
266
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
267 // GraphicsMagick stores the alpha values inverted, i.e.,
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
268 // 1 for transparent and 0 for opaque so we fix that here.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
269 const octave_idx_type nPixels = alpha.numel ();
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
270 for (octave_idx_type pix = 0; pix < nPixels; pix++)
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
271 alpha_fvec[pix] = 1 - amap_fvec[static_cast<int> (img_fvec[3])];
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
272
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
273 retval(2) = alpha;
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
274 }
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
275 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
276
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
277 return retval;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
278 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
279
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
280 // This function is highly repetitive, a bunch of for loops that are
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
281 // very similar to account for different image types. They are different
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
282 // enough that trying to reduce the copy and paste would decrease its
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
283 // readability too much.
10193
1a4074e277fe undo unintended change to __magick_read__.cc
John W. Eaton <jwe@octave.org>
parents: 10191
diff changeset
284 template <class T>
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
285 octave_value_list
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
286 read_images (std::vector<Magick::Image>& imvec,
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
287 const Array<octave_idx_type>& frameidx,
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
288 const octave_idx_type& nargout,
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
289 const octave_scalar_map& options)
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
290 {
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
291 typedef typename T::element_type P;
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
292
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
293 octave_value_list retval (3, Matrix ());
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
294
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
295 std::map<std::string, octave_idx_type> region = calculate_region (options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
296 const octave_idx_type nFrames = frameidx.length ();
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
297 const octave_idx_type nRows = region["row_out"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
298 const octave_idx_type nCols = region["col_out"];
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
299 T img;
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
300
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
301 // imvec has all of the pages of a file, even the ones we are not
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
302 // interested in. We will use the first image that we will be actually
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
303 // reading to get information about the image.
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
304 const octave_idx_type def_elem = frameidx(0);
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
305
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
306 const octave_idx_type row_start = region["row_start"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
307 const octave_idx_type col_start = region["col_start"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
308 const octave_idx_type row_shift = region["row_shift"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
309 const octave_idx_type col_shift = region["col_shift"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
310 const octave_idx_type row_cache = region["row_cache"];
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
311 const octave_idx_type col_cache = region["col_cache"];
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
312
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
313 // GraphicsMagick (GM) keeps the image values in memory using whatever
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
314 // QuantumDepth it was built with independently of the original image
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
315 // bitdepth. Basically this means that if GM was built with quantum 16
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
316 // all values are scaled in the uint16 range. If the original image
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
317 // had an 8 bit depth, we need to rescale it for that range.
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
318 // However, if the image had a bitdepth of 32, then we will be returning
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
319 // a floating point image. In this case, the values need to be rescaled
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
320 // for the range [0 1] (this is what Matlab has documented on the page
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
321 // about image types but in some cases seems to be doing something else.
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
322 // See bug #39249).
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
323 // Finally, we must do the division ourselves (set a divisor) instead of
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
324 // using quantumOperator for the cases where we will be returning floating
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
325 // point and want things in the range [0 1]. This is the same reason why
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
326 // the divisor is of type double.
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
327 // uint64_t is used in expression because default 32-bit value overflows
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
328 // when depth() is 32.
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
329 // TODO in the next release of GraphicsMagick, MaxRGB should be replaced
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
330 // with QuantumRange since MaxRGB is already deprecated in ImageMagick.
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
331 double divisor;
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
332 if (imvec[def_elem].depth () == 32)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
333 divisor = std::numeric_limits<uint32_t>::max ();
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
334 else
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
335 divisor = MaxRGB / ((uint64_t (1) << imvec[def_elem].depth ()) - 1);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
336
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
337 // FIXME: this workaround should probably be fixed in GM by creating a
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
338 // new ImageType BilevelMatteType
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
339 // Despite what GM documentation claims, opacity is not only on the types
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
340 // with Matte on the name. It is possible that an image is completely
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
341 // black (1 color), and have a second channel set for transparency (2nd
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
342 // color). Its type will be bilevel since there is no BilevelMatte. The
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
343 // only way to check for this seems to be by checking matte ().
17240
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
344 Magick::ImageType type = imvec[def_elem].type ();
d757c98636d8 Use first image to be read rather than first image in file to set defaults.
Carnë Draug <carandraug@octave.org>
parents: 17239
diff changeset
345 if (type == Magick::BilevelType && imvec[def_elem].matte ())
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
346 type = Magick::GrayscaleMatteType;
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
347
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
348 // FIXME: ImageType is the type being used to represent the image in memory
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
349 // by GM. The real type may be different (see among others bug #36820). For
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
350 // example, a png file where all channels are equal may report being
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
351 // grayscale or even bilevel. But we must always return the real image in
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
352 // file. In some cases, the original image attributes are stored in the
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
353 // attributes but this is undocumented. This should be fixed in GM so that
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
354 // a method such as original_type returns an actual Magick::ImageType
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
355 if (imvec[0].magick () == "PNG")
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
356 {
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
357 // These values come from libpng, not GM:
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
358 // Grayscale = 0
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
359 // Palette = 2 + 1
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
360 // RGB = 2
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
361 // RGB + Alpha = 2 + 4
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
362 // Grayscale + Alpha = 4
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
363 // We won't bother with case 3 (palette) since those should be
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
364 // read by the function to read indexed images
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
365 const std::string type_str
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
366 = imvec[0].attribute ("PNG:IHDR.color-type-orig");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
367
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
368 if (type_str == "0")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
369 type = Magick::GrayscaleType;
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
370 else if (type_str == "2")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
371 type = Magick::TrueColorType;
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
372 else if (type_str == "6")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
373 type = Magick::TrueColorMatteType;
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
374 else if (type_str == "4")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
375 type = Magick::GrayscaleMatteType;
17239
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
376 // Color types 0, 2, and 3 can also have alpha channel, conveyed
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
377 // via the "tRNS" chunk. For 0 and 2, it's limited to GIF-style
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
378 // binary transparency, while 3 can have any level of alpha per
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
379 // palette entry. We thus must check matte() to see if the image
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
380 // really doesn't have an alpha channel.
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
381 if (imvec[0].matte ())
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
382 {
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
383 if (type == Magick::GrayscaleType)
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
384 type = Magick::GrayscaleMatteType;
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
385 else if (type == Magick::TrueColorType)
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
386 type = Magick::TrueColorMatteType;
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
387 }
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
388 }
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
389
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
390 // If the alpha channel was not requested, treat images as if
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
391 // it doesn't exist.
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
392 if (nargout < 3)
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
393 {
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
394 switch (type)
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
395 {
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
396 case Magick::GrayscaleMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
397 type = Magick::GrayscaleType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
398 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
399
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
400 case Magick::PaletteMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
401 type = Magick::PaletteType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
402 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
403
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
404 case Magick::TrueColorMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
405 type = Magick::TrueColorType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
406 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
407
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
408 case Magick::ColorSeparationMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
409 type = Magick::ColorSeparationType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
410 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
411
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
412 default:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
413 // Do nothing other than silencing warnings about enumeration
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
414 // values not being handled in switch.
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
415 ;
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
416 }
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
417 }
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
418
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
419 switch (type)
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
420 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
421 case Magick::BilevelType: // Monochrome bi-level image
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
422 case Magick::GrayscaleType: // Grayscale image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
423 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
424 img = T (dim_vector (nRows, nCols, 1, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
425 P *img_fvec = img.fortran_vec ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
426
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
427 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
428 for (octave_idx_type frame = 0; frame < nFrames; frame++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
429 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
430 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
431 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
432 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
433
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
434 for (octave_idx_type col = 0; col < nCols; col++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
435 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
436 for (octave_idx_type row = 0; row < nRows; row++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
437 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
438 img_fvec[idx++] = pix->red / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
439 pix += row_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
440 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
441 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
442 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
443 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
444 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
445 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
446
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
447 case Magick::GrayscaleMatteType: // Grayscale image with opacity
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
448 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
449 img = T (dim_vector (nRows, nCols, 1, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
450 T alpha (dim_vector (nRows, nCols, 1, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
451 P *img_fvec = img.fortran_vec ();
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
452 P *a_fvec = alpha.fortran_vec ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
453
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
454 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
455 for (octave_idx_type frame = 0; frame < nFrames; frame++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
456 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
457 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
458 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
459 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
460
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
461 for (octave_idx_type col = 0; col < nCols; col++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
462 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
463 for (octave_idx_type row = 0; row < nRows; row++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
464 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
465 img_fvec[idx] = pix->red / divisor;
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
466 a_fvec[idx] = (MaxRGB - pix->opacity) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
467 pix += row_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
468 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
469 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
470 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
471 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
472 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
473 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
474 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
475 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
476
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
477 case Magick::PaletteType: // Indexed color (palette) image
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
478 case Magick::TrueColorType: // Truecolor image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
479 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
480 img = T (dim_vector (nRows, nCols, 3, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
481 P *img_fvec = img.fortran_vec ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
482
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
483 for (octave_idx_type frame = 0; frame < nFrames; frame++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
484 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
485 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
486 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
487 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
488
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
489 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
490 img_fvec += nRows * nCols * frame;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
491 P *rbuf = img_fvec;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
492 P *gbuf = img_fvec + nRows * nCols;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
493 P *bbuf = img_fvec + nRows * nCols * 2;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
494
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
495 for (octave_idx_type col = 0; col < nCols; col++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
496 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
497 for (octave_idx_type row = 0; row < nRows; row++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
498 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
499 rbuf[idx] = pix->red / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
500 gbuf[idx] = pix->green / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
501 bbuf[idx] = pix->blue / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
502 pix += row_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
503 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
504 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
505 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
506 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
507 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
508 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
509 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
510
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
511 case Magick::PaletteMatteType: // Indexed color image with opacity
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
512 case Magick::TrueColorMatteType: // Truecolor image with opacity
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
513 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
514 img = T (dim_vector (nRows, nCols, 3, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
515 T alpha (dim_vector (nRows, nCols, 1, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
516 P *img_fvec = img.fortran_vec ();
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
517 P *a_fvec = alpha.fortran_vec ();
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
518
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
519 // Unlike the index for the other channels, this one won't need
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
520 // to be reset on each frame since it's a separate matrix.
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
521 octave_idx_type a_idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
522 for (octave_idx_type frame = 0; frame < nFrames; frame++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
523 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
524 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
525 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
526 col_cache, row_cache);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
527
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
528 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
529 img_fvec += nRows * nCols * frame;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
530 P *rbuf = img_fvec;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
531 P *gbuf = img_fvec + nRows * nCols;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
532 P *bbuf = img_fvec + nRows * nCols * 2;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
533
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
534 for (octave_idx_type col = 0; col < nCols; col++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
535 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
536 for (octave_idx_type row = 0; row < nRows; row++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
537 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
538 rbuf[idx] = pix->red / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
539 gbuf[idx] = pix->green / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
540 bbuf[idx] = pix->blue / divisor;
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
541 a_fvec[a_idx++] = (MaxRGB - pix->opacity) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
542 pix += row_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
543 idx++;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
544 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
545 pix -= col_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
546 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
547 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
548 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
549 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
550 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
551
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
552 case Magick::ColorSeparationType: // Cyan/Magenta/Yellow/Black (CMYK) image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
553 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
554 img = T (dim_vector (nRows, nCols, 4, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
555 P *img_fvec = img.fortran_vec ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
556
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
557 for (octave_idx_type frame = 0; frame < nFrames; frame++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
558 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
559 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
560 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
561 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
562
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
563 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
564 img_fvec += nRows * nCols * frame;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
565 P *cbuf = img_fvec;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
566 P *mbuf = img_fvec + nRows * nCols;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
567 P *ybuf = img_fvec + nRows * nCols * 2;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
568 P *kbuf = img_fvec + nRows * nCols * 3;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
569
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
570 for (octave_idx_type col = 0; col < nCols; col++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
571 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
572 for (octave_idx_type row = 0; row < nRows; row++)
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
573 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
574 cbuf[idx] = pix->red / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
575 mbuf[idx] = pix->green / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
576 ybuf[idx] = pix->blue / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
577 kbuf[idx] = pix->opacity / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
578 pix += row_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
579 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
580 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
581 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
582 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
583 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
584 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
585 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
586
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
587 // Cyan, magenta, yellow, and black with alpha (opacity) channel
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
588 case Magick::ColorSeparationMatteType:
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
589 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
590 img = T (dim_vector (nRows, nCols, 4, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
591 T alpha (dim_vector (nRows, nCols, 1, nFrames));
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
592 P *img_fvec = img.fortran_vec ();
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
593 P *a_fvec = alpha.fortran_vec ();
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
594
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
595 // Unlike the index for the other channels, this one won't need
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
596 // to be reset on each frame since it's a separate matrix.
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
597 octave_idx_type a_idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
598 for (octave_idx_type frame = 0; frame < nFrames; frame++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
599 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
600 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
601 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
602 col_cache, row_cache);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
603 // Note that for CMYKColorspace + matte (CMYKA), the opacity is
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
604 // stored in the assocated IndexPacket.
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
605 const Magick::IndexPacket *apix
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
606 = imvec[frameidx(frame)].getConstIndexes ();
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
607
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
608 octave_idx_type idx = 0;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
609 img_fvec += nRows * nCols * frame;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
610 P *cbuf = img_fvec;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
611 P *mbuf = img_fvec + nRows * nCols;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
612 P *ybuf = img_fvec + nRows * nCols * 2;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
613 P *kbuf = img_fvec + nRows * nCols * 3;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
614
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
615 for (octave_idx_type col = 0; col < nCols; col++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
616 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
617 for (octave_idx_type row = 0; row < nRows; row++)
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
618 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
619 cbuf[idx] = pix->red / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
620 mbuf[idx] = pix->green / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
621 ybuf[idx] = pix->blue / divisor;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
622 kbuf[idx] = pix->opacity / divisor;
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
623 a_fvec[a_idx++] = (MaxRGB - *apix) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
624 pix += row_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
625 idx++;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
626 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
627 pix -= col_shift;
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
628 }
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
629 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
630 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
631 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
632 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
633
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
634 default:
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
635 error ("__magick_read__: unknown Magick++ image type");
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
636 return retval;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
637 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
638
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
639 retval(0) = img;
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
640 return retval;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
641 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
642
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
643 // Read a file into vector of image objects.
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
644 void static
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
645 read_file (const std::string& filename, std::vector<Magick::Image>& imvec)
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
646 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
647 try
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
648 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
649 Magick::readImages (&imvec, filename);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
650 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
651 catch (Magick::Warning& w)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
652 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
653 warning ("Magick++ warning: %s", w.what ());
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
654 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
655 catch (Magick::ErrorCoder& e)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
656 {
17705
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
657 // XXX: why is this error being caught as a warning? It has always
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
658 // been like this (function was added the first time to the
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
659 // Octave Forge image package with cset d756a7b6d533)
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
660 warning ("Magick++ coder error: %s", e.what ());
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
661 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
662 catch (Magick::Exception& e)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
663 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
664 error ("Magick++ exception: %s", e.what ());
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
665 error_state = 1;
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
666 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
667 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
668
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
669 static void
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
670 maybe_initialize_magick (void)
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
671 {
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
672 static bool initialized = false;
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
673
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
674 if (! initialized)
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
675 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
676 // Save locale as GraphicsMagick might change this (fixed in
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
677 // GraphicsMagick since version 1.3.13 released on December 24, 2011)
10739
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
678 const char *static_locale = setlocale (LC_ALL, NULL);
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
679 const std::string locale (static_locale);
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
680
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
681 const std::string program_name
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
682 = octave_env::get_program_invocation_name ();
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
683 Magick::InitializeMagick (program_name.c_str ());
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
684
10739
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
685 // Restore locale from before GraphicsMagick initialisation
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
686 setlocale (LC_ALL, locale.c_str ());
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
687
11036
169f59f626d3 Add check for QuantumDepth at initialization of *Magick and an associated warning
John Swensen <jpswensen@gmail.com>
parents: 11035
diff changeset
688 if (QuantumDepth < 32)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
689 warning ("your version of %s limits images to %d bits per pixel",
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
690 MagickPackageName, QuantumDepth);
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
691
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
692 initialized = true;
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
693 }
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
694 }
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
695 #endif
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
696
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
697 DEFUN_DLD (__magick_read__, args, nargout,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
698 "-*- texinfo -*-\n\
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
699 @deftypefn {Loadable Function} {[@var{img}, @var{map}, @var{alpha}] =} __magick_read__ (@var{fname}, @var{options})\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
700 Read image with GraphicsMagick or ImageMagick.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
701 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
702 This is a private internal function not intended for direct use. Instead\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
703 use @code{imread}.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
704 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
705 @seealso{imfinfo, imformats, imread, imwrite}\n\
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
706 @end deftypefn")
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
707 {
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
708 octave_value_list output;
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
709
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
710 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
711 gripe_disabled_feature ("imread", "Image IO");
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
712 #else
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
713
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
714 maybe_initialize_magick ();
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
715
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
716 if (args.length () != 2 || ! args(0).is_string ())
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
717 {
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
718 print_usage ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
719 return output;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
720 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
721
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
722 const octave_scalar_map options = args(1).scalar_map_value ();
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
723 if (error_state)
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
724 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
725 error ("__magick_read__: OPTIONS must be a struct");
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
726 return output;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
727 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
728
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
729 std::vector<Magick::Image> imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
730 read_file (args(0).string_value (), imvec);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
731 if (error_state)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
732 return output;
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
733
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
734 // Prepare an Array with the indexes for the requested frames.
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
735 const octave_idx_type nFrames = imvec.size ();
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
736 Array<octave_idx_type> frameidx;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
737 const octave_value indexes = options.getfield ("index");
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
738 if (indexes.is_string () && indexes.string_value () == "all")
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
739 {
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
740 frameidx.resize (dim_vector (1, nFrames));
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
741 for (octave_idx_type i = 0; i < nFrames; i++)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
742 frameidx(i) = i;
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
743 }
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
744 else
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
745 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
746 frameidx = indexes.int_vector_value ();
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
747 if (error_state)
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
748 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
749 error ("__magick_read__: invalid value for Index/Frame");
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
750 return output;
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
751 }
16989
7a69ab84b8c9 __magick_write__: confirm file exists before reading to append.
Carnë Draug <carandraug@octave.org>
parents: 16988
diff changeset
752 // Fix indexes from base 1 to base 0, and at the same time, make
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
753 // sure none of the indexes is outside the range of image number.
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
754 const octave_idx_type n = frameidx.nelem ();
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
755 for (octave_idx_type i = 0; i < n; i++)
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
756 {
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
757 frameidx(i)--;
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
758 if (frameidx(i) < 0 || frameidx(i) > nFrames - 1)
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
759 {
17912
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
760 // We do this check inside the loop because frameidx does not
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
761 // need to be ordered (this is a feature and even allows for
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
762 // some frames to be read multiple times).
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
763 error ("imread: index/frames specified are outside the number of images");
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
764 return output;
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
765 }
8053
89a512e8ec43 Replace leading tabs with spaces.
scofield@scofield
parents: 7974
diff changeset
766 }
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
767 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
768
17912
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
769 // Check that all frames have the same size. We don't do this at the same
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
770 // time we decode the image because that's done in many different places,
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
771 // to cover the different types of images which would lead to a lot of
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
772 // copy and paste.
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
773 const unsigned int nRows = imvec[frameidx(0)].rows ();
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
774 const unsigned int nCols = imvec[frameidx(0)].columns ();
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
775 for (octave_idx_type frame = 0; frame < nFrames; frame++)
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
776 {
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
777 if (nRows != imvec[frameidx(frame)].rows () ||
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
778 nCols != imvec[frameidx(frame)].columns ())
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
779 {
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
780 error ("imread: all frames must have the same size but frame %i is different",
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
781 frameidx(frame) +1);
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
782 error_state = 1;
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
783 }
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
784 }
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
785
01496d4811b1 imread: deal elegantly with multiples frames of different sizes.
Carnë Draug <carandraug@octave.org>
parents: 17861
diff changeset
786
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
787 const octave_idx_type depth = get_depth (imvec[frameidx(0)]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
788 if (is_indexed (imvec[frameidx(0)]))
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
789 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
790 if (depth <= 1)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
791 output = read_indexed_images<boolNDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
792 nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
793 else if (depth <= 8)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
794 output = read_indexed_images<uint8NDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
795 nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
796 else if (depth <= 16)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
797 output = read_indexed_images<uint16NDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
798 nargout, options);
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
799 else
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
800 {
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
801 error ("imread: indexed images with depths greater than 16-bit are not supported");
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
802 return output;
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
803 }
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
804 }
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11585
diff changeset
805
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
806 else
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
807 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
808 if (depth <= 1)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
809 output = read_images<boolNDArray> (imvec, frameidx, nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
810 else if (depth <= 8)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
811 output = read_images<uint8NDArray> (imvec, frameidx, nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
812 else if (depth <= 16)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
813 output = read_images<uint16NDArray> (imvec, frameidx, nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
814 else if (depth <= 32)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
815 output = read_images<FloatNDArray> (imvec, frameidx, nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
816 else
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
817 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
818 error ("imread: reading of images with %i-bit depth is not supported",
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
819 depth);
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
820 }
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
821 }
7937
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
822
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
823 #endif
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
824 return output;
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
825 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
826
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
827 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
828 ## No test needed for internal helper function.
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
829 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
830 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
831
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
832 #ifdef HAVE_MAGICK
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
833
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
834 template <class T>
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
835 static uint32NDArray
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
836 img_float2uint (const T& img)
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
837 {
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
838 typedef typename T::element_type P;
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
839 uint32NDArray out (img.dims ());
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
840
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
841 octave_uint32* out_fvec = out.fortran_vec ();
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
842 const P* img_fvec = img.fortran_vec ();
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
843
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
844 const octave_uint32 max = octave_uint32::max ();
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
845 const octave_idx_type numel = img.numel ();
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
846 for (octave_idx_type idx = 0; idx < numel; idx++)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
847 out_fvec[idx] = img_fvec[idx] * max;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
848
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
849 return out;
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
850 }
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
851
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
852 // Gets the bitdepth to be used for an Octave class, i.e, returns 8 for
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
853 // uint8, 16 for uint16, and 32 for uint32
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
854 template <class T>
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
855 static octave_idx_type
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
856 bitdepth_from_class ()
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
857 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
858 typedef typename T::element_type P;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
859 const octave_idx_type bitdepth =
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
860 sizeof (P) * std::numeric_limits<unsigned char>::digits;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
861 return bitdepth;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
862 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
863
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
864 static Magick::Image
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
865 init_enconde_image (const octave_idx_type& nCols, const octave_idx_type& nRows,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
866 const octave_idx_type& bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
867 const Magick::ImageType& type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
868 const Magick::ClassType& klass)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
869 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
870 Magick::Image img (Magick::Geometry (nCols, nRows), "black");
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
871 // Ensure that there are no other references to this image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
872 img.modifyImage ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
873
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
874 img.classType (klass);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
875 img.type (type);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
876 // FIXME: for some reason, setting bitdepth doesn't seem to work for
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
877 // indexed images.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
878 img.depth (bitdepth);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
879 switch (type)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
880 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
881 case Magick::GrayscaleMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
882 case Magick::TrueColorMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
883 case Magick::ColorSeparationMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
884 case Magick::PaletteMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
885 img.matte (true);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
886 break;
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
887
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
888 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
889 img.matte (false);
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
890 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
891
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
892 return img;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
893 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
894
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
895 template <class T>
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
896 static void
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
897 encode_indexed_images (std::vector<Magick::Image>& imvec,
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
898 const T& img,
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
899 const Matrix& cmap)
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
900 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
901 typedef typename T::element_type P;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
902 const octave_idx_type nFrames = img.ndims () < 4 ? 1 : img.dims ()(3);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
903 const octave_idx_type nRows = img.rows ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
904 const octave_idx_type nCols = img.columns ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
905 const octave_idx_type cmap_size = cmap.rows ();
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
906 const octave_idx_type bitdepth = bitdepth_from_class<T> ();
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
907
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
908 // There is no colormap object, we need to build a new one for each frame,
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
909 // even if it's always the same. We can least get a vector for the Colors.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
910 std::vector<Magick::ColorRGB> colormap;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
911 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
912 const double* cmap_fvec = cmap.fortran_vec ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
913 const octave_idx_type G_offset = cmap_size;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
914 const octave_idx_type B_offset = cmap_size * 2;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
915 for (octave_idx_type map_idx = 0; map_idx < cmap_size; map_idx++)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
916 colormap.push_back (Magick::ColorRGB (cmap_fvec[map_idx],
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
917 cmap_fvec[map_idx + G_offset],
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
918 cmap_fvec[map_idx + B_offset]));
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
919 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
920
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
921 for (octave_idx_type frame = 0; frame < nFrames; frame++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
922 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
923 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
924 Magick::PaletteType,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
925 Magick::PseudoClass);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
926
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
927 // Insert colormap.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
928 m_img.colorMapSize (cmap_size);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
929 for (octave_idx_type map_idx = 0; map_idx < cmap_size; map_idx++)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
930 m_img.colorMap (map_idx, colormap[map_idx]);
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
931
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
932 // Why are we also setting the pixel values instead of only the
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
933 // index values? We don't know if a file format supports indexed
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
934 // images. If we only set the indexes and then try to save the
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
935 // image as JPEG for example, the indexed values get discarded,
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
936 // there is no conversion from the indexes, it's the initial values
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
937 // that get used. An alternative would be to only set the pixel
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
938 // values (no indexes), then set the image as PseudoClass and GM
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
939 // would create a colormap for us. However, we wouldn't have control
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
940 // over the order of that colormap. And that's why we set both.
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
941 Magick::PixelPacket* pix = m_img.getPixels (0, 0, nCols, nRows);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
942 Magick::IndexPacket* ind = m_img.getIndexes ();
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
943 const P* img_fvec = img.fortran_vec ();
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
944
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
945 octave_idx_type GM_idx = 0;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
946 for (octave_idx_type column = 0; column < nCols; column++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
947 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
948 for (octave_idx_type row = 0; row < nRows; row++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
949 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
950 ind[GM_idx] = double (*img_fvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
951 pix[GM_idx] = m_img.colorMap (double (*img_fvec));
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
952 img_fvec++;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
953 GM_idx += nCols;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
954 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
955 GM_idx -= nCols * nRows - 1;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
956 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
957
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
958 // Save changes to underlying image.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
959 m_img.syncPixels ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
960 imvec.push_back (m_img);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
961 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
962 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
963
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
964 static void
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
965 encode_bool_image (std::vector<Magick::Image>& imvec, const boolNDArray& img)
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
966 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
967 const octave_idx_type nFrames = img.ndims () < 4 ? 1 : img.dims ()(3);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
968 const octave_idx_type nRows = img.rows ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
969 const octave_idx_type nCols = img.columns ();
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
970
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
971 // The initialized image will be black, this is for the other pixels
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
972 const Magick::Color white ("white");
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
973
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
974 const bool *img_fvec = img.fortran_vec ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
975 octave_idx_type img_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
976 for (octave_idx_type frame = 0; frame < nFrames; frame++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
977 {
17333
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
978 // For some reason, we can't set the type to Magick::BilevelType or
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
979 // the output image will be black, changing to white has no effect.
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
980 // However, this will still work fine and a binary image will be
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
981 // saved because we are setting the bitdepth to 1.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
982 Magick::Image m_img = init_enconde_image (nCols, nRows, 1,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
983 Magick::GrayscaleType,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
984 Magick::DirectClass);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
985
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
986 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
987 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
988 for (octave_idx_type col = 0; col < nCols; col++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
989 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
990 for (octave_idx_type row = 0; row < nRows; row++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
991 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
992 if (img_fvec[img_idx])
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
993 pix[GM_idx] = white;
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
994
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
995 img_idx++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
996 GM_idx += nCols;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
997 }
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
998 GM_idx -= nCols * nRows - 1;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
999 }
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1000 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1001 m_img.syncPixels ();
17333
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
1002 // While we could not set it to Bilevel at the start, we can do it
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
1003 // here otherwise some coders won't save it as binary.
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
1004 m_img.type (Magick::BilevelType);
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1005 imvec.push_back (m_img);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1006 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1007 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1008
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1009 template <class T>
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1010 static void
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1011 encode_uint_image (std::vector<Magick::Image>& imvec,
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1012 const T& img, const T& alpha)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1013 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1014 typedef typename T::element_type P;
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1015 const octave_idx_type channels = img.ndims () < 3 ? 1 : img.dims ()(2);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1016 const octave_idx_type nFrames = img.ndims () < 4 ? 1 : img.dims ()(3);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1017 const octave_idx_type nRows = img.rows ();
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1018 const octave_idx_type nCols = img.columns ();
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1019 const octave_idx_type bitdepth = bitdepth_from_class<T> ();
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1020
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1021 Magick::ImageType type;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1022 const bool has_alpha = ! alpha.is_empty ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1023 switch (channels)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1024 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1025 case 1:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1026 if (has_alpha)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1027 type = Magick::GrayscaleMatteType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1028 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1029 type = Magick::GrayscaleType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1030 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1031
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1032 case 3:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1033 if (has_alpha)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1034 type = Magick::TrueColorMatteType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1035 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1036 type = Magick::TrueColorType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1037 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1038
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1039 case 4:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1040 if (has_alpha)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1041 type = Magick::ColorSeparationMatteType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1042 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1043 type = Magick::ColorSeparationType;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1044 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1045
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1046 default:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1047 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1048 // __imwrite should have already filtered this cases
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1049 error ("__magick_write__: wrong size on 3rd dimension");
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1050 return;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1051 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1052 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1053
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1054 // We will be passing the values as integers with depth as specified
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1055 // by QuantumDepth (maximum value specified by MaxRGB). This is independent
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1056 // of the actual depth of the image. GM will then convert the values but
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1057 // while in memory, it always keeps the values as specified by QuantumDepth.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1058 // From GM documentation:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1059 // Color arguments are must be scaled to fit the Quantum size according to
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1060 // the range of MaxRGB
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1061 const double divisor = static_cast<double>((uint64_t (1) << bitdepth) - 1)
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1062 / MaxRGB;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1063
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1064 const P *img_fvec = img.fortran_vec ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1065 const P *a_fvec = alpha.fortran_vec ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1066 switch (type)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1067 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1068 case Magick::GrayscaleType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1069 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1070 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1071 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1072 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1073 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1074 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1075 Magick::DirectClass);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1076
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1077 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1078 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1079 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1080 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1081 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1082 Magick::Color c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1083 c.redQuantum (double (*img_fvec) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1084 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1085 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1086 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1087 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1088 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1089 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1090 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1091 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1092 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1093 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1094 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1095 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1096
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1097 case Magick::GrayscaleMatteType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1098 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1099 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1100 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1101 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1102 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1103 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1104 Magick::DirectClass);
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1105
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1106 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1107 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1108 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1109 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1110 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1111 Magick::Color c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1112 c.redQuantum (double (*img_fvec) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1113 c.alphaQuantum (MaxRGB - (double (*a_fvec) / divisor));
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1114 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1115 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1116 a_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1117 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1118 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1119 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1120 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1121 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1122 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1123 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1124 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1125 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1126 }
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1127
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1128 case Magick::TrueColorType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1129 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1130 // The fortran_vec offset for the green and blue channels
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1131 const octave_idx_type G_offset = nCols * nRows;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1132 const octave_idx_type B_offset = nCols * nRows * 2;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1133 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1134 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1135 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1136 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1137 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1138 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1139
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1140 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1141 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1142 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1143 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1144 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1145 Magick::Color c (double (*img_fvec) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1146 double (img_fvec[G_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1147 double (img_fvec[B_offset]) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1148 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1149 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1150 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1151 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1152 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1153 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1154 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1155 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1156 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1157 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1158 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1159 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1160
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1161 case Magick::TrueColorMatteType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1162 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1163 // The fortran_vec offset for the green and blue channels
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1164 const octave_idx_type G_offset = nCols * nRows;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1165 const octave_idx_type B_offset = nCols * nRows * 2;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1166 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1167 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1168 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1169 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1170 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1171 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1172
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1173 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1174 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1175 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1176 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1177 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1178 Magick::Color c (double (*img_fvec) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1179 double (img_fvec[G_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1180 double (img_fvec[B_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1181 MaxRGB - (double (*a_fvec) / divisor));
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1182 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1183 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1184 a_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1185 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1186 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1187 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1188 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1189 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1190 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1191 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1192 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1193 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1194 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1195
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1196 case Magick::ColorSeparationType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1197 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1198 // The fortran_vec offset for the Magenta, Yellow, and blacK channels
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1199 const octave_idx_type M_offset = nCols * nRows;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1200 const octave_idx_type Y_offset = nCols * nRows * 2;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1201 const octave_idx_type K_offset = nCols * nRows * 3;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1202 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1203 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1204 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1205 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1206 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1207 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1208
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1209 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1210 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1211 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1212 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1213 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1214 Magick::Color c (double (*img_fvec) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1215 double (img_fvec[M_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1216 double (img_fvec[Y_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1217 double (img_fvec[K_offset]) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1218 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1219 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1220 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1221 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1222 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1223 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1224 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1225 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1226 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1227 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1228 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1229 }
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1230
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1231 case Magick::ColorSeparationMatteType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1232 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1233 // The fortran_vec offset for the Magenta, Yellow, and blacK channels
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1234 const octave_idx_type M_offset = nCols * nRows;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1235 const octave_idx_type Y_offset = nCols * nRows * 2;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1236 const octave_idx_type K_offset = nCols * nRows * 3;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1237 octave_idx_type GM_idx = 0;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1238 for (octave_idx_type frame = 0; frame < nFrames; frame++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1239 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1240 Magick::Image m_img = init_enconde_image (nCols, nRows, bitdepth,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1241 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1242 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1243
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1244 Magick::PixelPacket *pix = m_img.getPixels (0, 0, nCols, nRows);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1245 Magick::IndexPacket *ind = m_img.getIndexes ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1246 for (octave_idx_type col = 0; col < nCols; col++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1247 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1248 for (octave_idx_type row = 0; row < nRows; row++)
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1249 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1250 Magick::Color c (double (*img_fvec) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1251 double (img_fvec[M_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1252 double (img_fvec[Y_offset]) / divisor,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1253 double (img_fvec[K_offset]) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1254 pix[GM_idx] = c;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1255 ind[GM_idx] = MaxRGB - (double (*a_fvec) / divisor);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1256 img_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1257 a_fvec++;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1258 GM_idx += nCols;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1259 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1260 GM_idx -= nCols * nRows - 1;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1261 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1262 // Save changes to underlying image.
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1263 m_img.syncPixels ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1264 imvec.push_back (m_img);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1265 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1266 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1267 }
11034
6589aaf769f6 Correctly handle logical and integer bit depths
John Swensen <jpswensen@gmail.com>
parents: 10988
diff changeset
1268
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1269 default:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1270 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1271 error ("__magick_write__: unrecognized Magick::ImageType");
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1272 return;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1273 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1274 }
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1275 return;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1276 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1277
17855
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1278 // Meant to be shared with both imfinfo and imwrite.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1279 static std::map<octave_idx_type, std::string>
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1280 init_disposal_methods ()
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1281 {
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1282 // GIF Specifications:
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1283 //
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1284 // Disposal Method - Indicates the way in which the graphic is to
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1285 // be treated after being displayed.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1286 //
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1287 // 0 - No disposal specified. The decoder is
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1288 // not required to take any action.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1289 // 1 - Do not dispose. The graphic is to be left
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1290 // in place.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1291 // 2 - Restore to background color. The area used by the
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1292 // graphic must be restored to the background color.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1293 // 3 - Restore to previous. The decoder is required to
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1294 // restore the area overwritten by the graphic with
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1295 // what was there prior to rendering the graphic.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1296 // 4-7 - To be defined.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1297 static std::map<octave_idx_type, std::string> methods;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1298 if (methods.empty ())
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1299 {
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1300 methods[0] = "doNotSpecify";
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1301 methods[1] = "leaveInPlace";
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1302 methods[2] = "restoreBG";
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1303 methods[3] = "restorePrevious";
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1304 }
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1305 return methods;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1306 }
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1307 static std::map<std::string, octave_idx_type>
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1308 init_reverse_disposal_methods ()
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1309 {
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1310 static std::map<std::string, octave_idx_type> methods;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1311 if (methods.empty ())
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1312 {
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1313 methods["donotspecify"] = 0;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1314 methods["leaveinplace"] = 1;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1315 methods["restorebg"] = 2;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1316 methods["restoreprevious"] = 3;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1317 }
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1318 return methods;
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1319 }
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1320
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1321 void static
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1322 write_file (const std::string& filename,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1323 const std::string& ext,
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1324 std::vector<Magick::Image>& imvec)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1325 {
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1326 try
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1327 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1328 Magick::writeImages (imvec.begin (), imvec.end (), ext + ":" + filename);
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1329 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1330 catch (Magick::Warning& w)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1331 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1332 warning ("Magick++ warning: %s", w.what ());
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1333 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1334 catch (Magick::ErrorCoder& e)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1335 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1336 warning ("Magick++ coder error: %s", e.what ());
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1337 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1338 catch (Magick::Exception& e)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1339 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1340 error ("Magick++ exception: %s", e.what ());
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1341 error_state = 1;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1342 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1343 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1344
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1345 #endif
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1346
9436
5302df15ad76 __magick_read__.cc: undo unintended change
John W. Eaton <jwe@octave.org>
parents: 9434
diff changeset
1347 DEFUN_DLD (__magick_write__, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1348 "-*- texinfo -*-\n\
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1349 @deftypefn {Loadable Function} {} __magick_write__ (@var{fname}, @var{fmt}, @var{img}, @var{map}, @var{options})\n\
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1350 Write image with GraphicsMagick or ImageMagick.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1351 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1352 This is a private internal function not intended for direct use. Instead\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1353 use @code{imwrite}.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1354 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1355 @seealso{imfinfo, imformats, imread, imwrite}\n\
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1356 @end deftypefn")
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1357 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1358 octave_value_list retval;
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1359
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1360 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1361 gripe_disabled_feature ("imwrite", "Image IO");
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1362 #else
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1363
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1364 maybe_initialize_magick ();
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1365
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1366 if (args.length () != 5 || ! args(0).is_string () || ! args(1).is_string ())
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1367 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1368 print_usage ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1369 return retval;
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1370 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1371 const std::string filename = args(0).string_value ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1372 const std::string ext = args(1).string_value ();
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1373
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1374 const octave_scalar_map options = args(4).scalar_map_value ();
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1375 if (error_state)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1376 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1377 error ("__magick_write__: OPTIONS must be a struct");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1378 return retval;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1379 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1380
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1381 const octave_value img = args(2);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1382 const Matrix cmap = args(3).matrix_value ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1383 if (error_state)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1384 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1385 error ("__magick_write__: invalid IMG or MAP");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1386 return retval;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1387 }
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1388
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1389 std::vector<Magick::Image> imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1390
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1391 if (cmap.is_empty ())
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1392 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1393 const octave_value alpha = options.getfield ("alpha");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1394 if (img.is_bool_type ())
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1395 encode_bool_image (imvec, img.bool_array_value ());
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1396 else if (img.is_uint8_type ())
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1397 encode_uint_image<uint8NDArray> (imvec, img.uint8_array_value (),
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1398 alpha.uint8_array_value ());
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1399 else if (img.is_uint16_type ())
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1400 encode_uint_image<uint16NDArray> (imvec, img.uint16_array_value (),
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1401 alpha.uint16_array_value ());
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1402 else if (img.is_uint32_type ())
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1403 encode_uint_image<uint32NDArray> (imvec, img.uint32_array_value (),
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1404 alpha.uint32_array_value ());
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1405 else if (img.is_float_type ())
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1406 {
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1407 // For image formats that support floating point values, we write
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1408 // the actual values. For those who don't, we only use the values
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1409 // on the range [0 1] and save integer values.
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1410 // But here, even for formats that would support floating point
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1411 // values, GM seems unable to do that so we at least make them uint32.
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1412 uint32NDArray clip_img;
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1413 uint32NDArray clip_alpha;
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1414 if (img.is_single_type ())
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1415 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1416 clip_img = img_float2uint<FloatNDArray>
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1417 (img.float_array_value ());
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1418 clip_alpha = img_float2uint<FloatNDArray>
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1419 (alpha.float_array_value ());
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1420 }
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1421 else
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1422 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1423 clip_img = img_float2uint<NDArray> (img.array_value ());
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1424 clip_alpha = img_float2uint<NDArray> (alpha.array_value ());
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1425 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1426 encode_uint_image<uint32NDArray> (imvec, clip_img, clip_alpha);
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1427 }
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1428 else
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1429 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1430 error ("__magick_write__: image type not supported");
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1431 return retval;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1432 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1433 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1434 else
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1435 {
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1436 // We should not get floating point indexed images here because we
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1437 // converted them in __imwrite__.m. We should probably do it here
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1438 // but it would look much messier.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1439 if (img.is_uint8_type ())
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1440 encode_indexed_images<uint8NDArray> (imvec, img.uint8_array_value (),
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1441 cmap);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1442 else if (img.is_uint16_type ())
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1443 encode_indexed_images<uint16NDArray> (imvec, img.uint16_array_value (),
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1444 cmap);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1445 else
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1446 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1447 error ("__magick_write__: indexed image must be uint8, uint16 or float.");
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1448 return retval;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1449 }
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1450 }
17855
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1451 static std::map<std::string, octave_idx_type> disposal_methods
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1452 = init_reverse_disposal_methods ();
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1453
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1454 const octave_idx_type nFrames = imvec.size ();
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1455
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1456 const octave_idx_type quality = options.getfield ("quality").int_value ();
17855
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1457 const ColumnVector delaytime = options.getfield ("delaytime").column_vector_value ();
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1458 const Array<std::string> disposalmethod = options.getfield ("disposalmethod").cellstr_value ();
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1459 for (octave_idx_type i = 0; i < nFrames; i++)
17855
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1460 {
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1461 imvec[i].quality (quality);
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1462 imvec[i].animationDelay (delaytime(i));
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1463 imvec[i].gifDisposeMethod (disposal_methods[disposalmethod(i)]);
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1464 }
17854
adb0ba0d0c13 imwrite: implement DelayTime option.
Carnë Draug <carandraug@octave.org>
parents: 17853
diff changeset
1465
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1466 // If writemode is set to append, read the image and append to it. Even
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1467 // if set to append, make sure that something was read at all.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1468 const std::string writemode = options.getfield ("writemode").string_value ();
16989
7a69ab84b8c9 __magick_write__: confirm file exists before reading to append.
Carnë Draug <carandraug@octave.org>
parents: 16988
diff changeset
1469 if (writemode == "append" && file_stat (filename).exists ())
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1470 {
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1471 std::vector<Magick::Image> ini_imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1472 read_file (filename, ini_imvec);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1473 if (error_state)
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1474 return retval;
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1475 if (ini_imvec.size () > 0)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1476 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1477 ini_imvec.insert (ini_imvec.end (), imvec.begin (), imvec.end ());
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1478 ini_imvec.swap (imvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1479 }
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1480 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1481
17861
870f3e12e163 maint: Use phrase "FIXME:" for problem areas in code.
Rik <rik@octave.org>
parents: 17855
diff changeset
1482 // FIXME: LoopCount or animationIterations
17855
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1483 // How it should work:
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1484 //
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1485 // This value is only set for the first image in the sequence. Trying
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1486 // to set this value with the append mode should have no effect, the
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1487 // value used with the first image is the one that counts (that would
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1488 // also be Matlab compatible). Thus, the right way to do this would be
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1489 // to have an else block on the condition above, and set this only
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1490 // when creating a new file. Since Matlab does not interpret a 4D
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1491 // matrix as sequence of images to write, its users need to use a for
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1492 // loop and set LoopCount only on the first iteration (it actually
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1493 // throws warnings otherwise)
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1494 //
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1495 // Why is this not done the right way:
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1496 //
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1497 // When GM saves a single image, it discards the value if there is only
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1498 // a single image and sets it to "no loop". Since our default is an
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1499 // infinite loop, if the user tries to do it the Matlab way (setting
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1500 // LoopCount only on the first image) that value will go nowhere.
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1501 // See https://sourceforge.net/p/graphicsmagick/bugs/248/
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1502 // Because of this, we document to set LoopCount on every iteration
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1503 // (in Matlab will cause a lot of warnings), or pass a 4D matrix with
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1504 // all frames (won't work in Matlab at all).
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1505 // Note that this only needs to be set on the first frame
bfbe5dcc9943 imwrite: implement DisposalMethod option.
Carnë Draug <carandraug@octave.org>
parents: 17854
diff changeset
1506 imvec[0].animationIterations (options.getfield ("loopcount").uint_value ());
17853
aacb9da13df6 imwrite: implement LoopCount option.
Carnë Draug <carandraug@octave.org>
parents: 17787
diff changeset
1507
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1508 write_file (filename, ext, imvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1509 if (error_state)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1510 return retval;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1511
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1512 #endif
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1513 return retval;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1514 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1515
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1516 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1517 ## No test needed for internal helper function.
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1518 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1519 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1520
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1521 // Gets the minimum information from images such as its size and format. Much
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1522 // faster than using imfinfo, which slows down a lot since. Note than without
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1523 // this, we need to read the image once for imfinfo to set defaults (which is
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1524 // done in Octave language), and then again for the actual reading.
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1525 DEFUN_DLD (__magick_ping__, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1526 "-*- texinfo -*-\n\
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1527 @deftypefn {Loadable Function} {} __magick_ping__ (@var{fname}, @var{idx})\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1528 Ping image information with GraphicsMagick or ImageMagick.\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1529 \n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1530 This is a private internal function not intended for direct use.\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1531 \n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1532 @seealso{imfinfo}\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1533 @end deftypefn")
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1534 {
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1535 octave_value retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1536 #ifndef HAVE_MAGICK
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1537 gripe_disabled_feature ("imfinfo", "Image IO");
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1538 #else
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1539 maybe_initialize_magick ();
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1540
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1541 if (args.length () < 1 || ! args(0).is_string ())
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1542 {
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1543 print_usage ();
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1544 return retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1545 }
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1546 const std::string filename = args(0).string_value ();
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1547 int idx;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1548 if (args.length () > 1)
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1549 idx = args(1).int_value () -1;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1550 else
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1551 idx = 0;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1552
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1553 Magick::Image img;
17705
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1554 img.subImage (idx); // start ping from this image (in case of multi-page)
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1555 img.subRange (1); // ping only one of them
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1556 try
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1557 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1558 img.ping (filename);
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1559 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1560 catch (Magick::Warning& w)
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1561 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1562 warning ("Magick++ warning: %s", w.what ());
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1563 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1564 catch (Magick::Exception& e)
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1565 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1566 error ("Magick++ exception: %s", e.what ());
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1567 return retval;
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1568 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1569
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1570 static const char *fields[] = {"rows", "columns", "format", 0};
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1571 octave_scalar_map ping = octave_scalar_map (string_vector (fields));
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1572 ping.setfield ("rows", octave_value (img.rows ()));
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1573 ping.setfield ("columns", octave_value (img.columns ()));
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1574 ping.setfield ("format", octave_value (img.magick ()));
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1575 retval = octave_value (ping);
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1576 #endif
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1577 return retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1578 }
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1579
8165
75014ec4ac84 __magick_read__.cc: only define magick_to_octave_value functions if HAVE_MAGICK is defined
John W. Eaton <jwe@octave.org>
parents: 8144
diff changeset
1580 #ifdef HAVE_MAGICK
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1581 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1582 magick_to_octave_value (const Magick::CompressionType& magick)
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1583 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1584 switch (magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1585 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1586 case Magick::NoCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1587 return octave_value ("none");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1588 case Magick::BZipCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1589 return octave_value ("bzip");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1590 case Magick::FaxCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1591 return octave_value ("fax3");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1592 case Magick::Group4Compression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1593 return octave_value ("fax4");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1594 case Magick::JPEGCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1595 return octave_value ("jpeg");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1596 case Magick::LZWCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1597 return octave_value ("lzw");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1598 case Magick::RLECompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1599 // This is named "rle" for the HDF, but the same thing is named
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1600 // "ccitt" and "PackBits" for binary and non-binary images in TIFF.
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1601 return octave_value ("rle");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1602 case Magick::ZipCompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1603 return octave_value ("deflate");
17362
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1604
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1605 // The following are present only in recent versions of GraphicsMagick.
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1606 // At the moment the only use of this would be to have imfinfo report
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1607 // the compression method. In the future, someone could implement
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1608 // the Compression option for imwrite in which case a macro in
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1609 // configure.ac will have to check for their presence of this.
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1610 // See bug #39913
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1611 // case Magick::LZMACompression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1612 // return octave_value ("lzma");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1613 // case Magick::JPEG2000Compression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1614 // return octave_value ("jpeg2000");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1615 // case Magick::JBIG1Compression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1616 // return octave_value ("jbig1");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1617 // case Magick::JBIG2Compression:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1618 // return octave_value ("jbig2");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1619 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1620 return octave_value ("undefined");
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1621 }
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1622 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1623
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1624 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1625 magick_to_octave_value (const Magick::EndianType& magick)
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1626 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1627 switch (magick)
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1628 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1629 case Magick::LSBEndian:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1630 return octave_value ("little-endian");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1631 case Magick::MSBEndian:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1632 return octave_value ("big-endian");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1633 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1634 return octave_value ("undefined");
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1635 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1636 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1637
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1638 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1639 magick_to_octave_value (const Magick::OrientationType& magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1640 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1641 switch (magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1642 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1643 // Values come from the TIFF6 spec
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1644 case Magick::TopLeftOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1645 return octave_value (1);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1646 case Magick::TopRightOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1647 return octave_value (2);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1648 case Magick::BottomRightOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1649 return octave_value (3);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1650 case Magick::BottomLeftOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1651 return octave_value (4);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1652 case Magick::LeftTopOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1653 return octave_value (5);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1654 case Magick::RightTopOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1655 return octave_value (6);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1656 case Magick::RightBottomOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1657 return octave_value (7);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1658 case Magick::LeftBottomOrientation:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1659 return octave_value (8);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1660 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1661 return octave_value (1);
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1662 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1663 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1664
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1665 static octave_value
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1666 magick_to_octave_value (const Magick::ResolutionType& magick)
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1667 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1668 switch (magick)
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1669 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1670 case Magick::PixelsPerInchResolution:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1671 return octave_value ("Inch");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1672 case Magick::PixelsPerCentimeterResolution:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1673 return octave_value ("Centimeter");
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1674 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1675 return octave_value ("undefined");
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1676 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1677 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1678
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1679 static bool
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1680 is_valid_exif (const std::string& val)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1681 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1682 // Sometimes GM will return the string "unknown" instead of empty
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1683 // for an empty value.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1684 return (! val.empty () && val != "unknown");
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1685 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1686
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1687 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1688 fill_exif (octave_scalar_map& map, Magick::Image& img,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1689 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1690 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1691 const std::string attr = img.attribute ("EXIF:" + key);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1692 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1693 map.setfield (key, octave_value (attr));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1694 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1695 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1696
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1697 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1698 fill_exif_ints (octave_scalar_map& map, Magick::Image& img,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1699 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1700 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1701 const std::string attr = img.attribute ("EXIF:" + key);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1702 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1703 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1704 // string of the type "float,float,float....."
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1705 float number;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1706 ColumnVector values (std::count (attr.begin (), attr.end (), ',') +1);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1707 std::string sub;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1708 std::istringstream sstream (attr);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1709 octave_idx_type n = 0;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1710 while (std::getline (sstream, sub, char (',')))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1711 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1712 sscanf (sub.c_str (), "%f", &number);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1713 values(n++) = number;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1714 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1715 map.setfield (key, octave_value (values));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1716 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1717 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1718 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1719
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1720 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1721 fill_exif_floats (octave_scalar_map& map, Magick::Image& img,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1722 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1723 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1724 const std::string attr = img.attribute ("EXIF:" + key);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1725 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1726 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1727 // string of the type "int/int,int/int,int/int....."
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1728 int numerator;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1729 int denominator;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1730 ColumnVector values (std::count (attr.begin (), attr.end (), ',') +1);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1731 std::string sub;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1732 std::istringstream sstream (attr);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1733 octave_idx_type n = 0;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1734 while (std::getline (sstream, sub, ','))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1735 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1736 sscanf (sub.c_str (), "%i/%i", &numerator, &denominator);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1737 values(n++) = double (numerator) / double (denominator);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1738 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1739 map.setfield (key, octave_value (values));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1740 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1741 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1742 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1743
8165
75014ec4ac84 __magick_read__.cc: only define magick_to_octave_value functions if HAVE_MAGICK is defined
John W. Eaton <jwe@octave.org>
parents: 8144
diff changeset
1744 #endif
75014ec4ac84 __magick_read__.cc: only define magick_to_octave_value functions if HAVE_MAGICK is defined
John W. Eaton <jwe@octave.org>
parents: 8144
diff changeset
1745
9436
5302df15ad76 __magick_read__.cc: undo unintended change
John W. Eaton <jwe@octave.org>
parents: 9434
diff changeset
1746 DEFUN_DLD (__magick_finfo__, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1747 "-*- texinfo -*-\n\
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
1748 @deftypefn {Loadable Function} {} __magick_finfo__ (@var{fname})\n\
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1749 Read image information with GraphicsMagick or ImageMagick.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1750 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1751 This is a private internal function not intended for direct use. Instead\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1752 use @code{imfinfo}.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1753 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1754 @seealso{imfinfo, imformats, imread, imwrite}\n\
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1755 @end deftypefn")
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1756 {
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1757 octave_value retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1758
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1759 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1760 gripe_disabled_feature ("imfinfo", "Image IO");
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1761 #else
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1762 maybe_initialize_magick ();
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1763
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1764 if (args.length () < 1 || ! args(0).is_string ())
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1765 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1766 print_usage ();
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1767 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1768 }
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1769 const std::string filename = args(0).string_value ();
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1770
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1771 std::vector<Magick::Image> imvec;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1772 read_file (filename, imvec);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1773 if (error_state)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1774 return retval;
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1775 const octave_idx_type nFrames = imvec.size ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1776 const std::string format = imvec[0].magick ();
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1777
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1778 // Here's how this function works. We need to return a struct array, one
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1779 // struct for each image in the file (remember, there are image
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1780 // that allow for multiple images in the same file). Now, Matlab seems
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1781 // to have format specific code so the fields on the struct are different
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1782 // for each format. It only has a small subset that is common to all
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1783 // of them, the others are undocumented. Because we try to abstract from
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1784 // the formats we always return the same list of fields (note that with
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1785 // GM we support more than 88 formats. That's way more than Matlab, and
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1786 // I don't want to write specific code for each of them).
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1787 //
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1788 // So what we do is we create an octave_scalar_map, fill it with the
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1789 // information for that image, and then insert it into an octave_map.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1790 // Because in the same file, different images may have values for
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1791 // different fields, we can't create a field only if there's a value.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1792 // Bad things happen if we merge octave_scalar_maps with different
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1793 // fields from the others (suppose for example a TIFF file with 4 images,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1794 // where only the third image has a colormap.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1795
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1796 static const char *fields[] =
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1797 {
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1798 // These are fields that must always appear for Matlab.
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1799 "Filename",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1800 "FileModDate",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1801 "FileSize",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1802 "Format",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1803 "FormatVersion",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1804 "Width",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1805 "Height",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1806 "BitDepth",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1807 "ColorType",
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1808
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1809 // These are format specific or not existent in Matlab. The most
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1810 // annoying thing is that Matlab may have different names for the
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1811 // same thing in different formats.
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1812 "DelayTime",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1813 "DisposalMethod",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1814 "LoopCount",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1815 "ByteOrder",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1816 "Gamma",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1817 "Chromaticities",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1818 "Comment",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1819 "Quality",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1820 "Compression", // same as CompressionType
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1821 "Colormap", // same as ColorTable (in PNG)
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1822 "Orientation",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1823 "ResolutionUnit",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1824 "XResolution",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1825 "YResolution",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1826 "Software", // sometimes is an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1827 "Make", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1828 "Model", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1829 "DateTime", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1830 "ImageDescription", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1831 "Artist", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1832 "Copyright", // actually an Exif tag
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1833 "DigitalCamera",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1834 "GPSInfo",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1835 // Notes for the future: GM allows to get many attributes, and even has
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1836 // attribute() to obtain arbitrary ones, that may exist in only some
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1837 // cases. The following is a list of some methods and into what possible
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1838 // Matlab compatible values they may be converted.
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1839 //
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1840 // colorSpace() -> PhotometricInterpretation
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1841 // backgroundColor() -> BackgroundColor
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1842 // interlaceType() -> Interlaced, InterlaceType, and PlanarConfiguration
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1843 // label() -> Title
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1844 0
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1845 };
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1846
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1847 // The one we will return at the end
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1848 octave_map info (dim_vector (nFrames, 1), string_vector (fields));
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11585
diff changeset
1849
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1850 // Some of the fields in the struct are about file information and will be
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1851 // the same for all images in the file. So we create a template, fill in
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1852 // those values, and make a copy of the template for each image.
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1853 octave_scalar_map template_info = (string_vector (fields));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1854
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1855 template_info.setfield ("Format", octave_value (format));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1856 // We can't actually get FormatVersion but even Matlab sometimes can't.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1857 template_info.setfield ("FormatVersion", octave_value (""));
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1858
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1859 const file_stat fs (filename);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1860 if (fs)
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1861 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1862 const octave_localtime mtime (fs.mtime ());
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1863 const std::string filetime = mtime.strftime ("%e-%b-%Y %H:%M:%S");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1864 template_info.setfield ("Filename", octave_value (filename));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1865 template_info.setfield ("FileModDate", octave_value (filetime));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1866 template_info.setfield ("FileSize", octave_value (fs.size ()));
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1867 }
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1868 else
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1869 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1870 error ("imfinfo: error reading '%s': %s",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1871 filename.c_str (), fs.error ().c_str ());
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1872 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1873 }
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1874
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1875 for (octave_idx_type frame = 0; frame < nFrames; frame++)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1876 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1877 octave_scalar_map info_frame (template_info);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1878 const Magick::Image img = imvec[frame];
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1879
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1880 info_frame.setfield ("Width", octave_value (img.columns ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1881 info_frame.setfield ("Height", octave_value (img.rows ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1882 info_frame.setfield ("BitDepth",
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1883 octave_value (get_depth (const_cast<Magick::Image&> (img))));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1884
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1885 // Stuff related to colormap, image class and type
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1886 // Because GM is too smart for us... Read the comments in is_indexed()
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1887 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1888 std::string color_type;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1889 Matrix cmap;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1890 if (is_indexed (img))
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1891 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1892 color_type = "indexed";
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1893 cmap =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1894 read_maps (const_cast<Magick::Image&> (img))(0).matrix_value ();
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1895 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1896 else
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1897 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1898 switch (img.type ())
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1899 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1900 case Magick::BilevelType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1901 case Magick::GrayscaleType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1902 case Magick::GrayscaleMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1903 color_type = "grayscale";
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1904 break;
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1905
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1906 case Magick::TrueColorType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1907 case Magick::TrueColorMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1908 color_type = "truecolor";
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1909 break;
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1910
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1911 case Magick::PaletteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1912 case Magick::PaletteMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1913 // we should never get here or is_indexed needs to be fixed
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1914 color_type = "indexed";
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1915 break;
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1916
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1917 case Magick::ColorSeparationType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1918 case Magick::ColorSeparationMatteType:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1919 color_type = "CMYK";
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1920 break;
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1921
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1922 default:
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1923 color_type = "undefined";
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1924 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1925 }
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1926 info_frame.setfield ("ColorType", octave_value (color_type));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1927 info_frame.setfield ("Colormap", octave_value (cmap));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1928 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1929
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1930 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1931 // Not all images have chroma values. In such cases, they'll
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1932 // be all zeros. So rather than send a matrix of zeros, we will
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1933 // check for that, and send an empty vector instead.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1934 RowVector chromaticities (8);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1935 double* chroma_fvec = chromaticities.fortran_vec ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1936 img.chromaWhitePoint (&chroma_fvec[0], &chroma_fvec[1]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1937 img.chromaRedPrimary (&chroma_fvec[2], &chroma_fvec[3]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1938 img.chromaGreenPrimary (&chroma_fvec[4], &chroma_fvec[5]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1939 img.chromaBluePrimary (&chroma_fvec[6], &chroma_fvec[7]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1940 if (chromaticities.nnz () == 0)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1941 chromaticities = RowVector (0);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1942 info_frame.setfield ("Chromaticities", octave_value (chromaticities));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1943 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1944
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1945 info_frame.setfield ("Gamma", octave_value (img.gamma ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1946 info_frame.setfield ("XResolution", octave_value (img.xResolution ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1947 info_frame.setfield ("YResolution", octave_value (img.yResolution ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1948 info_frame.setfield ("DelayTime", octave_value (img.animationDelay ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1949 info_frame.setfield ("LoopCount",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1950 octave_value (img.animationIterations ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1951 info_frame.setfield ("Quality", octave_value (img.quality ()));
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1952 info_frame.setfield ("Comment", octave_value (img.comment ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1953
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1954 info_frame.setfield ("Compression",
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1955 magick_to_octave_value (img.compressType ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1956 info_frame.setfield ("Orientation",
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1957 magick_to_octave_value (img.orientation ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1958 info_frame.setfield ("ResolutionUnit",
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1959 magick_to_octave_value (img.resolutionUnits ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1960 info_frame.setfield ("ByteOrder",
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1961 magick_to_octave_value (img.endian ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1962
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1963 // It is not possible to know if there's an Exif field so we just
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1964 // check for the Exif Version value. If it does exists, then we
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1965 // bother about looking for specific fields.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1966 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1967 Magick::Image& cimg = const_cast<Magick::Image&> (img);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1968
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1969 // These will be in Exif tags but must appear as fields in the
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1970 // base struct array, not as another struct in one of its fields.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1971 // This is likely because they belong to the Baseline TIFF specs
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1972 // and may appear out of the Exif tag. So first we check if it
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1973 // exists outside the Exif tag.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1974 // See Section 4.6.4, table 4, page 28 of Exif specs version 2.3
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1975 // (CIPA DC- 008-Translation- 2010)
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1976 static const char *base_exif_str_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1977 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1978 "DateTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1979 "ImageDescription",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1980 "Make",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1981 "Model",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1982 "Software",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1983 "Artist",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1984 "Copyright",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1985 0,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1986 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1987 static const string_vector base_exif_str (base_exif_str_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1988 static const octave_idx_type n_base_exif_str = base_exif_str.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1989 for (octave_idx_type field = 0; field < n_base_exif_str; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1990 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1991 info_frame.setfield (base_exif_str[field],
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1992 octave_value (cimg.attribute (base_exif_str[field])));
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1993 fill_exif (info_frame, cimg, base_exif_str[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1994 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1995
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1996 octave_scalar_map camera;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1997 octave_scalar_map gps;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1998 if (! cimg.attribute ("EXIF:ExifVersion").empty ())
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1999 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2000 // See Section 4.6.5, table 7 and 8, over pages page 42 to 43
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2001 // of Exif specs version 2.3 (CIPA DC- 008-Translation- 2010)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2002
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2003 // Listed on the Exif specs as being of type ASCII.
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2004 static const char *exif_str_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2005 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2006 "RelatedSoundFile",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2007 "DateTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2008 "DateTimeDigitized",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2009 "SubSecTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2010 "DateTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2011 "SubSecTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2012 "SubSecTimeDigitized",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2013 "ImageUniqueID",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2014 "CameraOwnerName",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2015 "BodySerialNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2016 "LensMake",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2017 "LensModel",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2018 "LensSerialNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2019 "SpectralSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2020 // These last two are of type undefined but most likely will
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2021 // be strings. Even if they're not GM returns a string anyway.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2022 "UserComment",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2023 "MakerComment",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2024 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2025 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2026 static const string_vector exif_str (exif_str_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2027 static const octave_idx_type n_exif_str = exif_str.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2028 for (octave_idx_type field = 0; field < n_exif_str; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2029 fill_exif (camera, cimg, exif_str[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2030
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2031 // Listed on the Exif specs as being of type SHORT or LONG.
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2032 static const char *exif_int_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2033 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2034 "ColorSpace",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2035 "ExifImageWidth", // PixelXDimension (CPixelXDimension in Matlab)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2036 "ExifImageHeight", // PixelYDimension (CPixelYDimension in Matlab)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2037 "PhotographicSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2038 "StandardOutputSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2039 "RecommendedExposureIndex",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2040 "ISOSpeed",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2041 "ISOSpeedLatitudeyyy",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2042 "ISOSpeedLatitudezzz",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2043 "FocalPlaneResolutionUnit",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2044 "FocalLengthIn35mmFilm",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2045 // Listed as SHORT or LONG but with more than 1 count.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2046 "SubjectArea",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2047 "SubjectLocation",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2048 // While the following are an integer, their value have a meaning
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2049 // that must be represented as a string for Matlab compatibility.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2050 // For example, a 3 on ExposureProgram, would return
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2051 // "Aperture priority" as defined on the Exif specs.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2052 "ExposureProgram",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2053 "SensitivityType",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2054 "MeteringMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2055 "LightSource",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2056 "Flash",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2057 "SensingMethod",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2058 "FileSource",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2059 "CustomRendered",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2060 "ExposureMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2061 "WhiteBalance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2062 "SceneCaptureType",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2063 "GainControl",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2064 "Contrast",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2065 "Saturation",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2066 "Sharpness",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2067 "SubjectDistanceRange",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2068 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2069 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2070 static const string_vector exif_int (exif_int_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2071 static const octave_idx_type n_exif_int = exif_int.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2072 for (octave_idx_type field = 0; field < n_exif_int; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2073 fill_exif_ints (camera, cimg, exif_int[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2074
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2075 // Listed as RATIONAL or SRATIONAL
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2076 static const char *exif_float_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2077 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2078 "Gamma",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2079 "CompressedBitsPerPixel",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2080 "ExposureTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2081 "FNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2082 "ShutterSpeedValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2083 "ApertureValue",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2084 "BrightnessValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2085 "ExposureBiasValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2086 "MaxApertureValue",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2087 "SubjectDistance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2088 "FocalLength",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2089 "FlashEnergy",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2090 "FocalPlaneXResolution",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2091 "FocalPlaneYResolution",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2092 "ExposureIndex",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2093 "DigitalZoomRatio",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2094 // Listed as RATIONAL or SRATIONAL with more than 1 count.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2095 "LensSpecification",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2096 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2097 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2098 static const string_vector exif_float (exif_float_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2099 static const octave_idx_type n_exif_float = exif_float.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2100 for (octave_idx_type field = 0; field < n_exif_float; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2101 fill_exif_floats (camera, cimg, exif_float[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2102
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2103 // Inside a Exif field, it is possible that there is also a
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2104 // GPS field. This is not the same as ExifVersion but seems
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2105 // to be how we have to check for it.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2106 if (cimg.attribute ("EXIF:GPSInfo") != "unknown")
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2107 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2108 // The story here is the same as with Exif.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2109 // See Section 4.6.6, table 15 on page 68 of Exif specs
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2110 // version 2.3 (CIPA DC- 008-Translation- 2010)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2111
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2112 static const char *gps_str_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2113 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2114 "GPSLatitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2115 "GPSLongitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2116 "GPSAltitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2117 "GPSSatellites",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2118 "GPSStatus",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2119 "GPSMeasureMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2120 "GPSSpeedRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2121 "GPSTrackRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2122 "GPSImgDirectionRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2123 "GPSMapDatum",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2124 "GPSDestLatitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2125 "GPSDestLongitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2126 "GPSDestBearingRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2127 "GPSDestDistanceRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2128 "GPSDateStamp",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2129 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2130 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2131 static const string_vector gps_str (gps_str_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2132 static const octave_idx_type n_gps_str = gps_str.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2133 for (octave_idx_type field = 0; field < n_gps_str; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2134 fill_exif (gps, cimg, gps_str[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2135
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2136 static const char *gps_int_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2137 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2138 "GPSDifferential",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2139 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2140 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2141 static const string_vector gps_int (gps_int_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2142 static const octave_idx_type n_gps_int = gps_int.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2143 for (octave_idx_type field = 0; field < n_gps_int; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2144 fill_exif_ints (gps, cimg, gps_int[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2145
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2146 static const char *gps_float_fields[] =
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2147 {
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2148 "GPSAltitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2149 "GPSDOP",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2150 "GPSSpeed",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2151 "GPSTrack",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2152 "GPSImgDirection",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2153 "GPSDestBearing",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2154 "GPSDestDistance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2155 "GPSHPositioningError",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2156 // Listed as RATIONAL or SRATIONAL with more than 1 count.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2157 "GPSLatitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2158 "GPSLongitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2159 "GPSTimeStamp",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2160 "GPSDestLatitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2161 "GPSDestLongitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2162 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2163 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2164 static const string_vector gps_float (gps_float_fields);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2165 static const octave_idx_type n_gps_float = gps_float.numel ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2166 for (octave_idx_type field = 0; field < n_gps_float; field++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2167 fill_exif_floats (gps, cimg, gps_float[field]);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2168
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2169 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2170 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2171 info_frame.setfield ("DigitalCamera", octave_value (camera));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2172 info_frame.setfield ("GPSInfo", octave_value (gps));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2173 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2174
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2175 info.fast_elem_insert (frame, info_frame);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2176 }
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2177
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2178 if (format == "GIF")
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2179 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2180 static std::map<octave_idx_type, std::string> disposal_methods
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2181 = init_disposal_methods ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2182 string_vector methods (nFrames);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2183 for (octave_idx_type frame = 0; frame < nFrames; frame++)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2184 methods[frame] = disposal_methods[imvec[frame].gifDisposeMethod ()];
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2185 info.setfield ("DisposalMethod", Cell (methods));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2186 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2187 else
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2188 info.setfield ("DisposalMethod",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2189 Cell (dim_vector (nFrames, 1), octave_value ("")));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2190
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2191 retval = octave_value (info);
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2192 #endif
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
2193 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2194 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2195
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2196 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2197 ## No test needed for internal helper function.
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2198 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2199 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2200
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2201 DEFUN_DLD (__magick_formats__, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
2202 "-*- texinfo -*-\n\
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2203 @deftypefn {Loadable Function} {} __magick_imformats__ (@var{formats})\n\
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2204 Fill formats info with GraphicsMagick CoderInfo.\n\
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
2205 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
2206 @seealso{imfinfo, imformats, imread, imwrite}\n\
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2207 @end deftypefn")
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2208 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2209 octave_value retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2210 #ifndef HAVE_MAGICK
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2211 gripe_disabled_feature ("imformats", "Image IO");
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2212 #else
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
2213 if (args.length () != 1 || ! args(0).is_map ())
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2214 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2215 print_usage ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2216 return retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2217 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2218 octave_map formats = args(0).map_value ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2219
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2220 maybe_initialize_magick ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2221 for (octave_idx_type idx = 0; idx < formats.numel (); idx++)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2222 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2223 try
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2224 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2225 octave_scalar_map fmt = formats.checkelem (idx);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2226 Magick::CoderInfo coder (fmt.getfield ("coder").string_value ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2227
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2228 fmt.setfield ("description", octave_value (coder.description ()));
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2229 fmt.setfield ("multipage", coder.isMultiFrame () ? true : false);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2230 // default for read and write is a function handle. If we can't
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2231 // read or write them, them set it to an empty value
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2232 if (! coder.isReadable ())
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2233 fmt.setfield ("read", Matrix ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2234 if (! coder.isWritable ())
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2235 fmt.setfield ("write", Matrix ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2236 formats.fast_elem_insert (idx, fmt);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2237 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2238 catch (Magick::Exception& e)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2239 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2240 // Exception here are missing formats. So we remove the format
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2241 // from the structure and reduce idx.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2242 formats.delete_elements (idx);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2243 idx--;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2244 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2245 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2246 retval = formats;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2247 #endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2248 return retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2249 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2250
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2251 /*
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2252 ## No test needed for internal helper function.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2253 %!assert (1)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2254 */