annotate libinterp/dldfcn/__magick_read__.cc @ 17744:d63878346099

maint: Update copyright notices for release.
author John W. Eaton <jwe@octave.org>
date Wed, 23 Oct 2013 22:09:27 -0400
parents 292319fb7fcc
children 175b392e91fe
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
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
214 const octave_idx_type row_start = region["row_start"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
215 const octave_idx_type col_start = region["col_start"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
216 const octave_idx_type row_shift = region["row_shift"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
217 const octave_idx_type col_shift = region["col_shift"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
218 const octave_idx_type row_cache = region["row_cache"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
219 const octave_idx_type col_cache = region["col_cache"];
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
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
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
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
306 const octave_idx_type row_start = region["row_start"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
307 const octave_idx_type col_start = region["col_start"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
308 const octave_idx_type row_shift = region["row_shift"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
309 const octave_idx_type col_shift = region["col_shift"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
310 const octave_idx_type row_cache = region["row_cache"];
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
311 const octave_idx_type col_cache = region["col_cache"];
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
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
365 const std::string type_str = imvec[0].attribute ("PNG:IHDR.color-type-orig");
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
366 if (type_str == "0")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
367 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
368 else if (type_str == "2")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
369 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
370 else if (type_str == "6")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
371 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
372 else if (type_str == "4")
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
373 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
374 // 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
375 // 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
376 // 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
377 // 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
378 // 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
379 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
380 {
d6467d6dfb83 Fix reading of alpha channel stored as tRNS chunk in PNG files.
Carnë Draug <carandraug@octave.org>
parents: 17235
diff changeset
381 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
382 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
383 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
384 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
385 }
17149
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
386 }
73a3c1580974 Correctly identify PNG image types (bug #32986, bug #36820 and bug #37689)
Carnë Draug <carandraug@octave.org>
parents: 17147
diff changeset
387
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
388 // 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
389 // 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
390 if (nargout < 3)
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
391 {
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
392 switch (type)
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 case Magick::GrayscaleMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
395 type = Magick::GrayscaleType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
396 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
397
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
398 case Magick::PaletteMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
399 type = Magick::PaletteType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
400 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
401
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
402 case Magick::TrueColorMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
403 type = Magick::TrueColorType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
404 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
405
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
406 case Magick::ColorSeparationMatteType:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
407 type = Magick::ColorSeparationType;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
408 break;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
409
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
410 default:
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
411 // Do nothing other than silencing warnings about enumeration
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
412 // values not being handled in switch.
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
413 ;
17116
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
414 }
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
415 }
59acfe9209dd Do not read alpha channel from image if output not requested.
Carnë Draug <carandraug@octave.org>
parents: 17110
diff changeset
416
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
417 switch (type)
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
418 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
419 case Magick::BilevelType: // Monochrome bi-level image
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
420 case Magick::GrayscaleType: // Grayscale image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
421 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
422 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
423 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
424
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
425 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
426 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
427 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
428 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
429 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
430 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
431
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
432 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
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 row = 0; row < nRows; row++)
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 img_fvec[idx++] = pix->red / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
437 pix += row_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
438 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
439 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
440 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
441 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
442 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
443 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
444
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
445 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
446 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
447 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
448 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
449 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
450 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
451
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
452 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
453 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
454 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
455 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
456 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
457 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
458
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
459 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
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 row = 0; row < nRows; row++)
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 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
464 a_fvec[idx] = (MaxRGB - pix->opacity) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
465 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
466 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
467 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
468 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
469 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
470 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
471 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
472 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
473 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
474
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
475 case Magick::PaletteType: // Indexed color (palette) image
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
476 case Magick::TrueColorType: // Truecolor image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
477 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
478 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
479 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
480
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
481 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
482 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
483 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
484 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
485 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
486
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
487 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
488 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
489 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
490 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
491 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
492
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
493 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
494 {
17110
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 row = 0; row < nRows; row++)
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 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
498 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
499 bbuf[idx] = pix->blue / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
500 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
501 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
502 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
503 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
504 }
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
505 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
506 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
507 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
508
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
509 case Magick::PaletteMatteType: // Indexed color (palette) image with opacity
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
510 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
511 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
512 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
513 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
514 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
515 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
516
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
517 // 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
518 // 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
519 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
520 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
521 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
522 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
523 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
524 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
525
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
526 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
527 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
528 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
529 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
530 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
531
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
532 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
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 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
535 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
536 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
537 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
538 bbuf[idx] = pix->blue / divisor;
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
539 a_fvec[a_idx++] = (MaxRGB - pix->opacity) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
540 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
541 idx++;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
542 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
543 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
544 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
545 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
546 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
547 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
548 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
549
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
550 case Magick::ColorSeparationType: // Cyan/Yellow/Magenta/Black (CYMK) image
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
551 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
552 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
553 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
554
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
555 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
556 {
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
557 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
558 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
559 col_cache, row_cache);
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
560
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
561 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
562 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
563 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
564 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
565 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
566 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
567
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
568 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
569 {
17110
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 row = 0; row < nRows; row++)
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 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
573 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
574 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
575 kbuf[idx] = pix->opacity / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
576 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
577 idx++;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
578 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
579 pix -= col_shift;
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
580 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
581 }
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
582 break;
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
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
585 // 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
586 case Magick::ColorSeparationMatteType:
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
587 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
588 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
589 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
590 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
591 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
592
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
593 // 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
594 // 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
595 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
596 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
597 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
598 const Magick::PixelPacket *pix
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
599 = imvec[frameidx(frame)].getConstPixels (col_start, row_start,
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
600 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
601 // 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
602 // 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
603 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
604 = imvec[frameidx(frame)].getConstIndexes ();
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
605
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
606 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
607 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
608 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
609 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
610 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
611 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
612
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
613 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
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 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
616 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
617 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
618 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
619 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
620 kbuf[idx] = pix->opacity / divisor;
17147
35a1bd41aa02 Fix reading of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17139
diff changeset
621 a_fvec[a_idx++] = (MaxRGB - *apix) / divisor;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
622 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
623 idx++;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
624 }
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
625 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
626 }
10295
13d382fc758b imread: Make reading non-indexed images faster
David Grundberg <davidg@cs.umu.se>
parents: 10193
diff changeset
627 }
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
628 retval(2) = alpha;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
629 break;
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
630 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
631
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
632 default:
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
633 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
634 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
635 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
636
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
637 retval(0) = img;
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
638 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
639 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
640
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
641 // Read a file into vector of image objects.
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
642 void static
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
643 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
644 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
645 try
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 Magick::readImages (&imvec, filename);
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 catch (Magick::Warning& w)
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 warning ("Magick++ warning: %s", w.what ());
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 catch (Magick::ErrorCoder& e)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
654 {
17705
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
655 // 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
656 // 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
657 // Octave Forge image package with cset d756a7b6d533)
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
658 warning ("Magick++ coder error: %s", e.what ());
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
659 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
660 catch (Magick::Exception& e)
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 error ("Magick++ exception: %s", e.what ());
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
663 error_state = 1;
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
664 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
665 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
666
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
667 static void
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
668 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
669 {
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
670 static bool initialized = false;
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
671
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
672 if (! initialized)
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
673 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
674 // Save locale as GraphicsMagick might change this (fixed in
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
675 // 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
676 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
677 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
678
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
679 const std::string program_name = 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
680 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
681
10739
d27bd2f74137 src/DLD_FUNCTIONS/__magick_read__.cc: restore locale after GraphicsMagick initialisation
Soren Hauberg <hauberg@gmail.com>
parents: 10390
diff changeset
682 // 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
683 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
684
11036
169f59f626d3 Add check for QuantumDepth at initialization of *Magick and an associated warning
John Swensen <jpswensen@gmail.com>
parents: 11035
diff changeset
685 if (QuantumDepth < 32)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
686 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
687 MagickPackageName, QuantumDepth);
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
688
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
689 initialized = true;
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
690 }
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
691 }
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
692 #endif
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
693
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
694 DEFUN_DLD (__magick_read__, args, nargout,
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
695 "-*- texinfo -*-\n\
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
696 @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
697 Read image with GraphicsMagick or ImageMagick.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
698 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
699 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
700 use @code{imread}.\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 @seealso{imfinfo, imformats, imread, imwrite}\n\
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
703 @end deftypefn")
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
704 {
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
705 octave_value_list output;
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
706
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
707 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
708 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
709 #else
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
710
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
711 maybe_initialize_magick ();
10390
ad0b54ae206a __magick_read__ (F__magick_read__): call Magick::InitializeMagick
John W. Eaton <jwe@octave.org>
parents: 10350
diff changeset
712
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
713 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
714 {
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
715 print_usage ();
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
716 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
717 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
718
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
719 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
720 if (error_state)
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
721 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
722 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
723 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
724 }
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
725
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
726 std::vector<Magick::Image> imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
727 read_file (args(0).string_value (), imvec);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
728 if (error_state)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
729 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
730
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
731 // 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
732 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
733 Array<octave_idx_type> frameidx;
17118
c97a26408ee0 Implement PixelRegion option for imread().
Carnë Draug <carandraug@octave.org>
parents: 17116
diff changeset
734 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
735 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
736 {
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
737 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
738 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
739 frameidx(i) = i;
10778
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
740 }
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
741 else
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
742 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
743 frameidx = indexes.int_vector_value ();
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
744 if (error_state)
10778
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 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
747 return output;
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
748 }
16989
7a69ab84b8c9 __magick_write__: confirm file exists before reading to append.
Carnë Draug <carandraug@octave.org>
parents: 16988
diff changeset
749 // 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
750 // 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
751 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
752 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
753 {
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
754 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
755 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
756 {
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
757 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
758 return output;
6035bf68a755 Support imread('file', 'frames', 'all') (Feature Request #30365)
David Bateman <dbateman@free.fr>
parents: 10739
diff changeset
759 }
8053
89a512e8ec43 Replace leading tabs with spaces.
scofield@scofield
parents: 7974
diff changeset
760 }
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
761 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
762
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
763 const octave_idx_type depth = get_depth (imvec[frameidx(0)]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
764 if (is_indexed (imvec[frameidx(0)]))
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
765 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
766 if (depth <= 1)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
767 output = read_indexed_images<boolNDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
768 nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
769 else if (depth <= 8)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
770 output = read_indexed_images<uint8NDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
771 nargout, options);
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
772 else if (depth <= 16)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
773 output = read_indexed_images<uint16NDArray> (imvec, frameidx,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
774 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
775 else
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
776 {
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
777 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
778 return output;
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
779 }
16984
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
780 }
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11585
diff changeset
781
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
782 else
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
783 {
17110
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
784 if (depth <= 1)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
785 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
786 else if (depth <= 8)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
787 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
788 else if (depth <= 16)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
789 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
790 else if (depth <= 32)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
791 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
792 else
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
793 {
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
794 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
795 depth);
95055b814d35 imread: implement reading of images with 32 bitdepth and alpha channels.
Carnë Draug <carandraug@octave.org>
parents: 16996
diff changeset
796 }
16996
a1d091243d11 Read alpha values from indexed images. Always read indexes from indexed images.
Carnë Draug <carandraug@octave.org>
parents: 16989
diff changeset
797 }
7937
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
798
6661387827d6 Allow build without GraphicsMagick installed
David Bateman <dbateman@free.fr>
parents: 7933
diff changeset
799 #endif
7925
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
800 return output;
9316b59903c9 Add original imread() files (from octave-forge) to core octave.
Thomas L. Scofield <scofield AT calvin DOT edu>
parents:
diff changeset
801 }
7926
d74f996e005d __magick_read__.cc: configuration and style fixes
John W. Eaton <jwe@octave.org>
parents: 7925
diff changeset
802
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
803 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
804 ## 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
805 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
806 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
807
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
808 #ifdef HAVE_MAGICK
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
809
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
810 template <class T>
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
811 static uint32NDArray
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
812 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
813 {
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
814 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
815 uint32NDArray out (img.dims ());
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
816
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
817 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
818 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
819
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
820 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
821 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
822 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
823 out_fvec[idx] = img_fvec[idx] * max;
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
824
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
825 return out;
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
826 }
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
827
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
828 // 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
829 // 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
830 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
831 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
832 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
833 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
834 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
835 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
836 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
837 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
838 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
839
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
840 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
841 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
842 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
843 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
844 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
845 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
846 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
847 // 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
848 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
849
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
850 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
851 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
852 // 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
853 // 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
854 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
855 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
856 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
857 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
858 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
859 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
860 case Magick::PaletteMatteType:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
861 img.matte (true);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
862 break;
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 default:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
865 img.matte (false);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
866 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
867
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
868 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
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
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
871 template <class T>
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
872 static void
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
873 encode_indexed_images (std::vector<Magick::Image>& imvec,
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
874 const T& img,
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
875 const Matrix& cmap)
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
876 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
877 typedef typename T::element_type P;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
878 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
879 const octave_idx_type nRows = img.rows ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
880 const octave_idx_type nCols = img.columns ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
881 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
882 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
883
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
884 // 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
885 // 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
886 std::vector<Magick::ColorRGB> colormap;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
887 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
888 const double* cmap_fvec = cmap.fortran_vec ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
889 const octave_idx_type G_offset = cmap_size;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
890 const octave_idx_type B_offset = cmap_size * 2;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
891 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
892 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
893 cmap_fvec[map_idx + G_offset],
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
894 cmap_fvec[map_idx + B_offset]));
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
895 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
896
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
897 for (octave_idx_type frame = 0; frame < nFrames; frame++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
898 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
899 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
900 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
901 Magick::PseudoClass);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
902
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
903 // Insert colormap.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
904 m_img.colorMapSize (cmap_size);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
905 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
906 m_img.colorMap (map_idx, colormap[map_idx]);
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
907
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
908 // 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
909 // 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
910 // 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
911 // 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
912 // 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
913 // 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
914 // 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
915 // 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
916 // over the order of that colormap. And that's why we set both.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
917 Magick::PixelPacket* pix = m_img.getPixels (0, 0, nCols, nRows);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
918 Magick::IndexPacket* ind = m_img.getIndexes ();
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
919 const P* img_fvec = img.fortran_vec ();
17226
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 octave_idx_type GM_idx = 0;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
922 for (octave_idx_type column = 0; column < nCols; column++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
923 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
924 for (octave_idx_type row = 0; row < nRows; row++)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
925 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
926 ind[GM_idx] = double (*img_fvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
927 pix[GM_idx] = m_img.colorMap (double (*img_fvec));
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
928 img_fvec++;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
929 GM_idx += nCols;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
930 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
931 GM_idx -= nCols * nRows - 1;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
932 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
933
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
934 // Save changes to underlying image.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
935 m_img.syncPixels ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
936 imvec.push_back (m_img);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
937 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
938 }
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
939
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
940 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
941 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
942 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
943 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
944 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
945 const octave_idx_type nCols = img.columns ();
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
946
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
947 // 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
948 const Magick::Color white ("white");
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
949
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
950 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
951 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
952 for (octave_idx_type frame = 0; frame < nFrames; frame++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
953 {
17333
51c011825bcc __magick_write__: make sure binary images are saved as bilevel for some coders.
Carnë Draug <carandraug@octave.org>
parents: 17332
diff changeset
954 // 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
955 // 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
956 // 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
957 // 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
958 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
959 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
960 Magick::DirectClass);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
961
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
962 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
963 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
964 for (octave_idx_type col = 0; col < nCols; col++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
965 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
966 for (octave_idx_type row = 0; row < nRows; row++)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
967 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
968 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
969 pix[GM_idx] = white;
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
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 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
972 GM_idx += nCols;
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 GM_idx -= nCols * nRows - 1;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
975 }
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
976 // 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
977 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
978 // 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
979 // 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
980 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
981 imvec.push_back (m_img);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
982 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
983 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
984
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
985 template <class T>
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
986 static void
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
987 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
988 const T& img, const T& alpha)
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 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
991 const octave_idx_type channels = img.ndims () < 3 ? 1 : img.dims ()(2);
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
992 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
993 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
994 const octave_idx_type nCols = img.columns ();
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
995 const octave_idx_type bitdepth = bitdepth_from_class<T> ();
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
996
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
997 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
998 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
999 switch (channels)
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1000 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1001 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
1002 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
1003 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
1004 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1005 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
1006 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1007
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1008 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
1009 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
1010 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
1011 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1012 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
1013 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1014
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1015 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
1016 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
1017 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
1018 else
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1019 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
1020 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1021
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1022 default:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1023 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1024 // __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
1025 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
1026 return;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1027 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1028 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1029
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1030 // 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
1031 // 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
1032 // 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
1033 // 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
1034 // 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
1035 // 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
1036 // the range of MaxRGB
17561
b41860a0bc24 Fix integer overflow in imwrite with floating point and uint32 images
Mike Miller <mtmiller@ieee.org>
parents: 17455
diff changeset
1037 const double divisor = static_cast<double>((uint64_t (1) << bitdepth) - 1) / MaxRGB;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1038
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1039 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
1040 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
1041 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
1042 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1043 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
1044 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1045 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
1046 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
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 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
1049 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1050 Magick::DirectClass);
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1051
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1052 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
1053 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
1054 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1055 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
1056 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1057 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
1058 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
1059 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
1060 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
1061 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
1062 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1063 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
1064 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1065 // 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
1066 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
1067 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
1068 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1069 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1070 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1071
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1072 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
1073 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1074 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
1075 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
1076 {
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::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
1078 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1079 Magick::DirectClass);
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1080
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1081 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
1082 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
1083 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1084 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
1085 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1086 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
1087 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
1088 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
1089 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
1090 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
1091 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
1092 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
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 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
1095 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1096 // 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
1097 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
1098 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
1099 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1100 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1101 }
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1102
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1103 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
1104 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1105 // 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
1106 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
1107 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
1108 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
1109 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
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::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
1112 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1113 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1114
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1115 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
1116 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
1117 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1118 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
1119 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1120 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
1121 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
1122 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
1123 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
1124 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
1125 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
1126 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1127 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
1128 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1129 // 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
1130 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
1131 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
1132 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1133 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1134 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1135
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1136 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
1137 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1138 // 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
1139 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
1140 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
1141 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
1142 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
1143 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1144 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
1145 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1146 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1147
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1148 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
1149 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
1150 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1151 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
1152 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1153 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
1154 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
1155 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
1156 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
1157 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
1158 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
1159 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
1160 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
1161 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1162 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
1163 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1164 // 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
1165 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
1166 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
1167 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1168 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1169 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1170
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1171 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
1172 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1173 // 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
1174 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
1175 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
1176 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
1177 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
1178 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
1179 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1180 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
1181 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1182 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1183
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1184 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
1185 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
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 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
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 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
1190 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
1191 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
1192 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
1193 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
1194 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
1195 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
1196 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1197 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
1198 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1199 // 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
1200 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
1201 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
1202 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1203 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1204 }
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1205
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1206 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
1207 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1208 // 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
1209 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
1210 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
1211 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
1212 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
1213 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
1214 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1215 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
1216 type,
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1217 Magick::DirectClass);
10979
7f49dc864f32 __magick_read__.cc: style fixes
John W. Eaton <jwe@octave.org>
parents: 10978
diff changeset
1218
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1219 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
1220 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
1221 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
1222 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1223 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
1224 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1225 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
1226 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
1227 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
1228 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
1229 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
1230 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
1231 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
1232 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
1233 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
1234 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1235 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
1236 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1237 // 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
1238 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
1239 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
1240 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1241 break;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1242 }
11034
6589aaf769f6 Correctly handle logical and integer bit depths
John Swensen <jpswensen@gmail.com>
parents: 10988
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 default:
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1245 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1246 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
1247 return;
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1248 }
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1249 }
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1250 return;
8054
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1251 }
272eaebbb6ba Various features added to imwrite
scofield@scofield
parents: 8053
diff changeset
1252
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1253 void static
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1254 write_file (const std::string& filename,
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1255 const std::string& ext,
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1256 std::vector<Magick::Image>& imvec)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1257 {
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1258 try
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1259 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1260 Magick::writeImages (imvec.begin (), imvec.end (), ext + ":" + filename);
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1261 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1262 catch (Magick::Warning& w)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1263 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1264 warning ("Magick++ warning: %s", w.what ());
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1265 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1266 catch (Magick::ErrorCoder& e)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1267 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1268 warning ("Magick++ coder error: %s", e.what ());
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1269 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1270 catch (Magick::Exception& e)
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1271 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1272 error ("Magick++ exception: %s", e.what ());
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1273 error_state = 1;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1274 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1275 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1276
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1277 #endif
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1278
9436
5302df15ad76 __magick_read__.cc: undo unintended change
John W. Eaton <jwe@octave.org>
parents: 9434
diff changeset
1279 DEFUN_DLD (__magick_write__, args, ,
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1280 "-*- texinfo -*-\n\
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1281 @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
1282 Write image with GraphicsMagick or ImageMagick.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1283 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1284 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
1285 use @code{imwrite}.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1286 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1287 @seealso{imfinfo, imformats, imread, imwrite}\n\
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1288 @end deftypefn")
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1289 {
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1290 octave_value_list retval;
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1291
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1292 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1293 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
1294 #else
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1295
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1296 maybe_initialize_magick ();
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1297
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1298 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
1299 {
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1300 print_usage ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1301 return retval;
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1302 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1303 const std::string filename = args(0).string_value ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1304 const std::string ext = args(1).string_value ();
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1305
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1306 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
1307 if (error_state)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1308 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1309 error ("__magick_write__: OPTIONS must be a struct");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1310 return retval;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1311 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1312
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1313 const octave_value img = args(2);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1314 const Matrix cmap = args(3).matrix_value ();
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1315 if (error_state)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1316 {
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1317 error ("__magick_write__: invalid IMG or MAP");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1318 return retval;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1319 }
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1320
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1321 std::vector<Magick::Image> imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1322
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1323 if (cmap.is_empty ())
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1324 {
17332
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1325 const octave_value alpha = options.getfield ("alpha");
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1326 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
1327 encode_bool_image (imvec, img.bool_array_value ());
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1328 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
1329 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
1330 alpha.uint8_array_value ());
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1331 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
1332 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
1333 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
1334 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
1335 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
1336 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
1337 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
1338 {
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1339 // 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
1340 // 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
1341 // 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
1342 // 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
1343 // 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
1344 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
1345 uint32NDArray clip_alpha;
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1346 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
1347 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1348 clip_img = img_float2uint<FloatNDArray> (img.float_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
1349 clip_alpha = img_float2uint<FloatNDArray> (alpha.float_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
1350 }
17228
2f1729cae08f Initial support for writing of floating point and uint32 images.
Carnë Draug <carandraug@octave.org>
parents: 17226
diff changeset
1351 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
1352 {
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1353 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
1354 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
1355 }
eb7e9a991ffb Implement writing of CMYK and fix writing of image alpha channel (bug #32986).
Carnë Draug <carandraug@octave.org>
parents: 17240
diff changeset
1356 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
1357 }
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1358 else
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1359 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1360 error ("__magick_write__: image type not supported");
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1361 return retval;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1362 }
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1363 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1364 else
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1365 {
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1366 // 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
1367 // 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
1368 // but it would look much messier.
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1369 if (img.is_uint8_type ())
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1370 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
1371 cmap);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1372 else if (img.is_uint16_type ())
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1373 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
1374 cmap);
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1375 else
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1376 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1377 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
1378 return retval;
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1379 }
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1380 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1381
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1382 const octave_idx_type nFrames = imvec.size ();
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1383
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1384 // FIXME What happens when we try to set with formats that do not support it?
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1385 const octave_idx_type quality = options.getfield ("quality").int_value ();
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1386 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
1387 imvec[i].quality (quality);
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1388
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1389 // 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
1390 // 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
1391 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
1392 if (writemode == "append" && file_stat (filename).exists ())
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1393 {
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1394 std::vector<Magick::Image> ini_imvec;
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1395 read_file (filename, ini_imvec);
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1396 if (error_state)
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1397 return retval;
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1398 if (ini_imvec.size () > 0)
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1399 {
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1400 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
1401 ini_imvec.swap (imvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1402 }
16988
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1403 }
54b75bed4bc7 imwrite: implement WriteMode option.
Carnë Draug <carandraug@octave.org>
parents: 16984
diff changeset
1404
17226
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1405 write_file (filename, ext, imvec);
46805642048f Implement writing of indexed images.
Carnë Draug <carandraug@octave.org>
parents: 17149
diff changeset
1406 if (error_state)
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1407 return retval;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1408
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1409 #endif
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1410 return retval;
7974
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1411 }
fcaddd090f98 imwrite: new function
John W. Eaton <jwe@octave.org>
parents: 7937
diff changeset
1412
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1413 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1414 ## 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
1415 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1416 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
1417
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1418 // 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
1419 // 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
1420 // 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
1421 // 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
1422 DEFUN_DLD (__magick_ping__, args, ,
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1423 "-*- texinfo -*-\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1424 @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
1425 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
1426 \n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1427 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
1428 \n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1429 @seealso{imfinfo}\n\
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1430 @end deftypefn")
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1431 {
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1432 octave_value retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1433 #ifndef HAVE_MAGICK
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1434 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
1435 #else
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1436 maybe_initialize_magick ();
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1437
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1438 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
1439 {
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1440 print_usage ();
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1441 return retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1442 }
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1443 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
1444 int idx;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1445 if (args.length () > 1)
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1446 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
1447 else
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1448 idx = 0;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1449
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1450 Magick::Image img;
17705
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1451 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
1452 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
1453 try
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1454 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1455 img.ping (filename);
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1456 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1457 catch (Magick::Warning& w)
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1458 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1459 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
1460 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1461 catch (Magick::Exception& e)
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1462 {
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1463 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
1464 return retval;
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1465 }
292319fb7fcc Catch Magick++ errors and warnings when pinging image (bug #40267)
Carnë Draug <carandraug@octave.org>
parents: 17561
diff changeset
1466
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1467 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
1468 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
1469 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
1470 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
1471 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
1472 retval = octave_value (ping);
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1473 #endif
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1474 return retval;
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1475 }
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17350
diff changeset
1476
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
1477 #ifdef HAVE_MAGICK
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1478 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1479 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
1480 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1481 switch (magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1482 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1483 case Magick::NoCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1484 return octave_value ("none");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1485 case Magick::BZipCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1486 return octave_value ("bzip");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1487 case Magick::FaxCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1488 return octave_value ("fax3");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1489 case Magick::Group4Compression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1490 return octave_value ("fax4");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1491 case Magick::JPEGCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1492 return octave_value ("jpeg");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1493 case Magick::LZWCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1494 return octave_value ("lzw");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1495 case Magick::RLECompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1496 // This is named "rle" for the HDF, but the same thing is named
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1497 // "ccitt" and "PackBits" for binary and non-binary images in TIFF.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1498 return octave_value ("rle");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1499 case Magick::ZipCompression:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1500 return octave_value ("deflate");
17362
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1501
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1502 // 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
1503 // 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
1504 // 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
1505 // 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
1506 // 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
1507 // See bug #39913
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1508 // case Magick::LZMACompression:
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1509 // return octave_value ("lzma");
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1510 // case Magick::JPEG2000Compression:
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1511 // return octave_value ("jpeg2000");
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1512 // case Magick::JBIG1Compression:
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1513 // return octave_value ("jbig1");
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1514 // case Magick::JBIG2Compression:
6e1a3b8fc312 __magick_finfo__: remove recent Magick compression types (bug #39913)
Carnë Draug <carandraug@octave.org>
parents: 17359
diff changeset
1515 // return octave_value ("jbig2");
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1516 default:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1517 return octave_value ("undefined");
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1518 }
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1519 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1520
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1521 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1522 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
1523 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1524 switch (magick)
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1525 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1526 case Magick::LSBEndian:
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1527 return octave_value ("little-endian");
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1528 case Magick::MSBEndian:
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1529 return octave_value ("big-endian");
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1530 default:
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1531 return octave_value ("undefined");
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1532 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1533 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1534
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1535 static octave_value
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1536 magick_to_octave_value (const Magick::OrientationType& magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1537 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1538 switch (magick)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1539 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1540 // Values come from the TIFF6 spec
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1541 case Magick::TopLeftOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1542 return octave_value (1);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1543 case Magick::TopRightOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1544 return octave_value (2);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1545 case Magick::BottomRightOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1546 return octave_value (3);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1547 case Magick::BottomLeftOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1548 return octave_value (4);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1549 case Magick::LeftTopOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1550 return octave_value (5);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1551 case Magick::RightTopOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1552 return octave_value (6);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1553 case Magick::RightBottomOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1554 return octave_value (7);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1555 case Magick::LeftBottomOrientation:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1556 return octave_value (8);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1557 default:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1558 return octave_value (1);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1559 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1560 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1561
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1562 static octave_value
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1563 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
1564 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1565 switch (magick)
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1566 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1567 case Magick::PixelsPerInchResolution:
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1568 return octave_value ("Inch");
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1569 case Magick::PixelsPerCentimeterResolution:
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1570 return octave_value ("Centimeter");
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1571 default:
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1572 return octave_value ("undefined");
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1573 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1574 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1575
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1576 // Meant to be shared with both imfinfo and imwrite.
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1577 static std::map<octave_idx_type, std::string>
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1578 init_disposal_methods ()
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1579 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1580 // GIF Specifications:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1581 //
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1582 // Disposal Method - Indicates the way in which the graphic is to
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1583 // be treated after being displayed.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1584 //
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1585 // 0 - No disposal specified. The decoder is
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1586 // not required to take any action.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1587 // 1 - Do not dispose. The graphic is to be left
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1588 // in place.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1589 // 2 - Restore to background color. The area used by the
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1590 // graphic must be restored to the background color.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1591 // 3 - Restore to previous. The decoder is required to
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1592 // restore the area overwritten by the graphic with
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1593 // what was there prior to rendering the graphic.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1594 // 4-7 - To be defined.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1595 static std::map<octave_idx_type, std::string> methods;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1596 if (methods.empty ())
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1597 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1598 methods[0] = "doNotSpecify";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1599 methods[1] = "leaveInPlace";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1600 methods[2] = "restoreBG";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1601 methods[3] = "restorePrevious";
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1602 }
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1603 return methods;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1604 }
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1605
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1606 static bool
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1607 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
1608 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1609 // 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
1610 // for an empty value.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1611 return (! val.empty () && val != "unknown");
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1612 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1613
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1614 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1615 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
1616 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1617 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1618 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
1619 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1620 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
1621 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1622 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1623
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1624 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1625 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
1626 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1627 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1628 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
1629 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1630 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1631 // 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
1632 float number;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1633 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
1634 std::string sub;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1635 std::istringstream sstream (attr);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1636 octave_idx_type n = 0;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1637 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
1638 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1639 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
1640 values(n++) = number;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1641 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1642 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
1643 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1644 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1645 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1646
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1647 static void
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1648 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
1649 const std::string& key)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1650 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1651 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
1652 if (is_valid_exif (attr))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1653 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1654 // 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
1655 int numerator;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1656 int denominator;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1657 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
1658 std::string sub;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1659 std::istringstream sstream (attr);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1660 octave_idx_type n = 0;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1661 while (std::getline (sstream, sub, ','))
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1662 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1663 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
1664 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
1665 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1666 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
1667 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1668 return;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1669 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1670
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
1671 #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
1672
9436
5302df15ad76 __magick_read__.cc: undo unintended change
John W. Eaton <jwe@octave.org>
parents: 9434
diff changeset
1673 DEFUN_DLD (__magick_finfo__, args, ,
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1674 "-*- 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
1675 @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
1676 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
1677 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1678 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
1679 use @code{imfinfo}.\n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1680 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
1681 @seealso{imfinfo, imformats, imread, imwrite}\n\
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1682 @end deftypefn")
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1683 {
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1684 octave_value retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1685
16983
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1686 #ifndef HAVE_MAGICK
4660d047955e Make use of gripe_disabled_feature() for image IO functions.
Carnë Draug <carandraug+dev@gmail.com>
parents: 16944
diff changeset
1687 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
1688 #else
10947
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1689 maybe_initialize_magick ();
dc74ce93cfc4 initialize GraphicsMagick in all __magick_* functions
Jaroslav Hajek <highegg@gmail.com>
parents: 10840
diff changeset
1690
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1691 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
1692 {
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1693 print_usage ();
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1694 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1695 }
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
1696 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
1697
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1698 std::vector<Magick::Image> imvec;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1699 read_file (filename, imvec);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1700 if (error_state)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1701 return retval;
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1702 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
1703 const std::string format = imvec[0].magick ();
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1704
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1705 // 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
1706 // 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
1707 // 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
1708 // 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
1709 // 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
1710 // 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
1711 // 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
1712 // 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
1713 // 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
1714 //
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1715 // 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
1716 // 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
1717 // 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
1718 // 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
1719 // 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
1720 // 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
1721 // 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
1722
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1723 static const char *fields[] =
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1724 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1725 // These are fields that must always appear for Matlab.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1726 "Filename",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1727 "FileModDate",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1728 "FileSize",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1729 "Format",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1730 "FormatVersion",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1731 "Width",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1732 "Height",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1733 "BitDepth",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1734 "ColorType",
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1735
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1736 // These are format specific or not existent in Matlab. The most
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1737 // annoying thing is that Matlab may have different names for the
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1738 // same thing in different formats.
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1739 "DelayTime",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1740 "DisposalMethod",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1741 "LoopCount",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1742 "ByteOrder",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1743 "Gamma",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1744 "Chromaticities",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1745 "Comment",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1746 "Quality",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1747 "Compression", // same as CompressionType
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1748 "Colormap", // same as ColorTable (in PNG)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1749 "Orientation",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1750 "ResolutionUnit",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1751 "XResolution",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1752 "YResolution",
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1753 "Software", // sometimes is an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1754 "Make", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1755 "Model", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1756 "DateTime", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1757 "ImageDescription", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1758 "Artist", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1759 "Copyright", // actually an Exif tag
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1760 "DigitalCamera",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1761 "GPSInfo",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1762 // Notes for the future: GM allows to get many attributes, and even has
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1763 // attribute() to obtain arbitrary ones, that may exist in only some
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1764 // cases. The following is a list of some methods and into what possible
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1765 // Matlab compatible values they may be converted.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1766 //
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1767 // colorSpace() -> PhotometricInterpretation
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1768 // backgroundColor() -> BackgroundColor
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1769 // interlaceType() -> Interlaced, InterlaceType, and PlanarConfiguration
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1770 // label() -> Title
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1771 0
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1772 };
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
1773
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1774 // The one we will return at the end
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1775 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
1776
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1777 // 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
1778 // 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
1779 // 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
1780 octave_scalar_map template_info = (string_vector (fields));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1781
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1782 template_info.setfield ("Format", octave_value (format));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1783 // 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
1784 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
1785
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1786 const file_stat fs (filename);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1787 if (fs)
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1788 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1789 const octave_localtime mtime (fs.mtime ());
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1790 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
1791 template_info.setfield ("Filename", octave_value (filename));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1792 template_info.setfield ("FileModDate", octave_value (filetime));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1793 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
1794 }
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1795 else
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1796 {
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1797 error ("imfinfo: error reading '%s': %s",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1798 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
1799 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
1800 }
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1801
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1802 for (octave_idx_type frame = 0; frame < nFrames; frame++)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1803 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1804 octave_scalar_map info_frame (template_info);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1805 const Magick::Image img = imvec[frame];
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1806
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1807 info_frame.setfield ("Width", octave_value (img.columns ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1808 info_frame.setfield ("Height", octave_value (img.rows ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1809 info_frame.setfield ("BitDepth",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1810 octave_value (get_depth (const_cast<Magick::Image&> (img))));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1811
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1812 // Stuff related to colormap, image class and type
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1813 // 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
1814 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1815 std::string color_type;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1816 Matrix cmap;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1817 if (is_indexed (img))
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1818 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1819 color_type = "indexed";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1820 cmap = read_maps (const_cast<Magick::Image&> (img))(0).matrix_value ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1821 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1822 else
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1823 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1824 switch (img.type ())
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1825 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1826 case Magick::BilevelType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1827 case Magick::GrayscaleType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1828 case Magick::GrayscaleMatteType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1829 color_type = "grayscale";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1830 break;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1831
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1832 case Magick::TrueColorType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1833 case Magick::TrueColorMatteType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1834 color_type = "truecolor";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1835 break;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1836
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1837 case Magick::PaletteType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1838 case Magick::PaletteMatteType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1839 // we should never get here or is_indexed needs to be fixed
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1840 color_type = "indexed";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1841 break;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1842
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1843 case Magick::ColorSeparationType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1844 case Magick::ColorSeparationMatteType:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1845 color_type = "CMYK";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1846 break;
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1847
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1848 default:
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1849 color_type = "undefined";
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1850 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1851 }
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1852 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
1853 info_frame.setfield ("Colormap", octave_value (cmap));
17350
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
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1856 {
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1857 // 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
1858 // 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
1859 // check for that, and send an empty vector instead.
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1860 RowVector chromaticities (8);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1861 double* chroma_fvec = chromaticities.fortran_vec ();
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1862 img.chromaWhitePoint (&chroma_fvec[0], &chroma_fvec[1]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1863 img.chromaRedPrimary (&chroma_fvec[2], &chroma_fvec[3]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1864 img.chromaGreenPrimary (&chroma_fvec[4], &chroma_fvec[5]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1865 img.chromaBluePrimary (&chroma_fvec[6], &chroma_fvec[7]);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1866 if (chromaticities.nnz () == 0)
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1867 chromaticities = RowVector (0);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1868 info_frame.setfield ("Chromaticities", octave_value (chromaticities));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1869 }
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1870
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1871 info_frame.setfield ("Gamma", octave_value (img.gamma ()));
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1872 info_frame.setfield ("XResolution", octave_value (img.xResolution ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1873 info_frame.setfield ("YResolution", octave_value (img.yResolution ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1874 info_frame.setfield ("DelayTime", octave_value (img.animationDelay ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1875 info_frame.setfield ("LoopCount", octave_value (img.animationIterations ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1876 info_frame.setfield ("Quality", octave_value (img.quality ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1877 info_frame.setfield ("Comment", octave_value (img.comment ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1878
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1879 info_frame.setfield ("Compression",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1880 magick_to_octave_value (img.compressType ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1881 info_frame.setfield ("Orientation",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1882 magick_to_octave_value (img.orientation ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1883 info_frame.setfield ("ResolutionUnit",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1884 magick_to_octave_value (img.resolutionUnits ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1885 info_frame.setfield ("ByteOrder",
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1886 magick_to_octave_value (img.endian ()));
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
1887
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1888 // 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
1889 // 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
1890 // 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
1891 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1892 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
1893
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1894 // 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
1895 // 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
1896 // 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
1897 // 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
1898 // exists outside the Exif tag.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1899 // 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
1900 // (CIPA DC- 008-Translation- 2010)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1901 static const char *base_exif_str_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1902 "DateTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1903 "ImageDescription",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1904 "Make",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1905 "Model",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1906 "Software",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1907 "Artist",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1908 "Copyright",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1909 0,
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1910 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1911 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
1912 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
1913 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
1914 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1915 info_frame.setfield (base_exif_str[field],
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1916 octave_value (cimg.attribute (base_exif_str[field])));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1917 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
1918 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1919
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1920 octave_scalar_map camera;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1921 octave_scalar_map gps;
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1922 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
1923 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1924 // 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
1925 // 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
1926
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1927 // Listed on the Exif specs as being of type ASCII.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1928 static const char *exif_str_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1929 "RelatedSoundFile",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1930 "DateTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1931 "DateTimeDigitized",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1932 "SubSecTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1933 "DateTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1934 "SubSecTimeOriginal",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1935 "SubSecTimeDigitized",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1936 "ImageUniqueID",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1937 "CameraOwnerName",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1938 "BodySerialNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1939 "LensMake",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1940 "LensModel",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1941 "LensSerialNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1942 "SpectralSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1943 // 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
1944 // 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
1945 "UserComment",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1946 "MakerComment",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1947 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1948 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1949 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
1950 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
1951 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
1952 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
1953
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1954 // Listed on the Exif specs as being of type SHORT or LONG.
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1955 static const char *exif_int_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1956 "ColorSpace",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1957 "ExifImageWidth", // PixelXDimension (CPixelXDimension in Matlab)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1958 "ExifImageHeight", // PixelYDimension (CPixelYDimension in Matlab)
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1959 "PhotographicSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1960 "StandardOutputSensitivity",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1961 "RecommendedExposureIndex",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1962 "ISOSpeed",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1963 "ISOSpeedLatitudeyyy",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1964 "ISOSpeedLatitudezzz",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1965 "FocalPlaneResolutionUnit",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1966 "FocalLengthIn35mmFilm",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1967 // 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
1968 "SubjectArea",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1969 "SubjectLocation",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1970 // 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
1971 // 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
1972 // 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
1973 // "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
1974 "ExposureProgram",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1975 "SensitivityType",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1976 "MeteringMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1977 "LightSource",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1978 "Flash",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1979 "SensingMethod",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1980 "FileSource",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1981 "CustomRendered",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1982 "ExposureMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1983 "WhiteBalance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1984 "SceneCaptureType",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1985 "GainControl",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1986 "Contrast",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1987 "Saturation",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1988 "Sharpness",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1989 "SubjectDistanceRange",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1990 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1991 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1992 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
1993 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
1994 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
1995 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
1996
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1997 // Listed as RATIONAL or SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1998 static const char *exif_float_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
1999 "Gamma",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2000 "CompressedBitsPerPixel",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2001 "ExposureTime",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2002 "FNumber",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2003 "ShutterSpeedValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2004 "ApertureValue",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2005 "BrightnessValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2006 "ExposureBiasValue", // SRATIONAL
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2007 "MaxApertureValue",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2008 "SubjectDistance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2009 "FocalLength",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2010 "FlashEnergy",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2011 "FocalPlaneXResolution",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2012 "FocalPlaneYResolution",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2013 "ExposureIndex",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2014 "DigitalZoomRatio",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2015 // 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
2016 "LensSpecification",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2017 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2018 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2019 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
2020 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
2021 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
2022 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
2023
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2024 // 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
2025 // 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
2026 // 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
2027 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
2028 {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2029 // 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
2030 // 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
2031 // 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
2032
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2033 static const char *gps_str_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2034 "GPSLatitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2035 "GPSLongitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2036 "GPSAltitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2037 "GPSSatellites",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2038 "GPSStatus",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2039 "GPSMeasureMode",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2040 "GPSSpeedRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2041 "GPSTrackRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2042 "GPSImgDirectionRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2043 "GPSMapDatum",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2044 "GPSDestLatitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2045 "GPSDestLongitudeRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2046 "GPSDestBearingRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2047 "GPSDestDistanceRef",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2048 "GPSDateStamp",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2049 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2050 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2051 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
2052 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
2053 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
2054 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
2055
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2056 static const char *gps_int_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2057 "GPSDifferential",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2058 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2059 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2060 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
2061 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
2062 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
2063 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
2064
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2065 static const char *gps_float_fields[] = {
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2066 "GPSAltitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2067 "GPSDOP",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2068 "GPSSpeed",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2069 "GPSTrack",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2070 "GPSImgDirection",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2071 "GPSDestBearing",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2072 "GPSDestDistance",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2073 "GPSHPositioningError",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2074 // 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
2075 "GPSLatitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2076 "GPSLongitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2077 "GPSTimeStamp",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2078 "GPSDestLatitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2079 "GPSDestLongitude",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2080 0
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2081 };
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2082 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
2083 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
2084 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
2085 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
2086
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2087 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2088 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2089 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
2090 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
2091 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2092
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2093 info.fast_elem_insert (frame, info_frame);
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2094 }
17359
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2095
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2096 if (format == "GIF")
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 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
2099 = init_disposal_methods ();
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2100 string_vector methods (nFrames);
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2101 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
2102 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
2103 info.setfield ("DisposalMethod", Cell (methods));
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2104 }
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2105 else
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2106 info.setfield ("DisposalMethod",
cf5d41cc3695 Expand imfinfo to read Exif tags and GPS information.
Carnë Draug <carandraug@octave.org>
parents: 17351
diff changeset
2107 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
2108
17350
ba79ba4e83ab Rewrite of imfinfo.
Carnë Draug <carandraug@octave.org>
parents: 17335
diff changeset
2109 retval = octave_value (info);
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2110 #endif
10333
0c42b6b7da24 imfinfo: support image files with multiple frames
Søren Hauberg <soren@hauberg.org>
parents: 10298
diff changeset
2111 return retval;
8144
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2112 }
01fac748b680 Add the 'imfinfo' function for reading image file information.
sh@sh-laptop
parents: 8090
diff changeset
2113
12805
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2114 /*
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2115 ## 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
2116 %!assert (1)
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2117 */
3641167e5b75 codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents: 11590
diff changeset
2118
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2119 DEFUN_DLD (__magick_formats__, args, ,
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2120 "-*- texinfo -*-\n\
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2121 @deftypefn {Loadable Function} {} __magick_imformats__ (@var{formats})\n\
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2122 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
2123 \n\
997efb8d0b19 imread: implement options Index, Frames, and Info.
Carnë Draug <carandraug@octave.org>
parents: 16983
diff changeset
2124 @seealso{imfinfo, imformats, imread, imwrite}\n\
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2125 @end deftypefn")
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2126 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2127 octave_value retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2128 #ifndef HAVE_MAGICK
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2129 gripe_disabled_feature ("imformats", "Image IO");
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2130 #else
17235
96a1c132e3c6 __magick_read__.cc: follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents: 17228
diff changeset
2131 if (args.length () != 1 || ! args(0).is_map ())
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2132 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2133 print_usage ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2134 return retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2135 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2136 octave_map formats = args(0).map_value ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2137
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2138 maybe_initialize_magick ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2139 for (octave_idx_type idx = 0; idx < formats.numel (); idx++)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2140 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2141 try
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2142 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2143 octave_scalar_map fmt = formats.checkelem (idx);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2144 Magick::CoderInfo coder (fmt.getfield ("coder").string_value ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2145
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2146 fmt.setfield ("description", octave_value (coder.description ()));
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2147 fmt.setfield ("multipage", coder.isMultiFrame () ? true : false);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2148 // 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
2149 // read or write them, them set it to an empty value
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2150 if (! coder.isReadable ())
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2151 fmt.setfield ("read", Matrix ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2152 if (! coder.isWritable ())
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2153 fmt.setfield ("write", Matrix ());
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2154 formats.fast_elem_insert (idx, fmt);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2155 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2156 catch (Magick::Exception& e)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2157 {
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2158 // Exception here are missing formats. So we remove the format
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2159 // from the structure and reduce idx.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2160 formats.delete_elements (idx);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2161 idx--;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2162 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2163 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2164 retval = formats;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2165 #endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2166 return retval;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2167 }
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2168
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2169 /*
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2170 ## No test needed for internal helper function.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2171 %!assert (1)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents: 16871
diff changeset
2172 */