27 #ifndef MLN_IO_MAGICK_LOAD_HH
28 # define MLN_IO_MAGICK_LOAD_HH
36 # include <Magick++.h>
38 # include <mln/core/image/image2d.hh>
40 # include <mln/value/int_u8.hh>
41 # include <mln/value/rgb8.hh>
43 # include <mln/io/magick/internal/init_magick.hh>
77 load(Image<tiled2d<T> >& ima,
const std::string&
filename);
81 # ifndef MLN_INCLUDE_ONLY
88 do_it(
const value::rgb8& in,
bool& out)
90 if (in.red() != in.green() || in.green() != in.blue())
93 "error: attempt to load what looks like a color\n"
94 "(mln::value::rgb8) image into a Boolean (bool) image" <<
102 "error: attempt to load what looks like a grayscale\n"
103 "(mln::value::int_u8) image into a Boolean (bool) image" <<
108 out = (in.red() != 0);
114 do_it(
const value::rgb8& in, value::int_u8& out)
116 if (in.red() != in.green() || in.green() != in.blue())
119 "error: attempt to load what looks like a color\n"
120 "(mln::value::rgb8) image into a grayscale\n"
121 "(mln::int_u8 values) image" << std::endl;
131 do_it(
const value::rgb8& in, value::rgb8& out)
140 template <
typename I>
145 mln_trace(
"mln::io::magick::load");
147 I& ima =
exact(ima_);
150 static internal::init_magick
init;
155 Magick::Image magick_ima(filename);
156 magick_ima.read(filename);
157 magick_ima.type(Magick::TrueColorType);
158 int nrows = magick_ima.rows();
159 int ncols = magick_ima.columns();
160 mln_site(I) pmin(0, 0);
161 mln_site(I) pmax(nrows - 1, ncols - 1);
163 mln_concrete(I) result(
box<mln_site(I)>(pmin, pmax));
172 Magick::Pixels view(magick_ima);
174 Magick::PixelPacket* pixels = view.
get(0, 0, ima.ncols(), ima.nrows());
175 mln_value(I) *ptr_ima = &ima(ima.domain().pmin());
177 unsigned row_offset = ima.delta_offset(dpoint2d(+1, - ncols));
179 for (def::
coord row = minrow; row <= maxrow;
180 ++row, ptr_ima += row_offset)
181 for (def::
coord col = mincol; col <= maxcol; ++col)
189 value::rgb8 c(pixels->red >> 8 * (
sizeof(Magick::Quantum)
191 pixels->green >> 8 * (
sizeof(Magick::Quantum)
193 pixels->blue >> 8 * (
sizeof(Magick::Quantum)
196 if (!impl::do_it(c, res))
198 std::cerr <<
"while trying to load `" << filename <<
"'"
209 # endif // ! MLN_INCLUDE_ONLY
218 #endif // ! MLN_IO_MAGICK_LOAD_HH