00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef MLN_IO_MAGICK_SAVE_HH
00028 # define MLN_IO_MAGICK_SAVE_HH
00029
00038
00039 # include <cstdlib>
00040
00041 # include <Magick++.h>
00042
00043 # include <mln/metal/equal.hh>
00044
00045 # include <mln/core/image/image2d.hh>
00046
00047 # include <mln/value/int_u8.hh>
00048 # include <mln/value/rgb8.hh>
00049 # include <mln/value/qt/rgb32.hh>
00050
00051
00052 namespace mln
00053 {
00054
00055 namespace io
00056 {
00057
00058 namespace magick
00059 {
00060
00065 template <typename I>
00066 void
00067 save(const Image<I>& ima, const std::string& filename);
00068
00069
00070
00071 #if 0
00072
00076 template <typename T>
00077 void
00078 save(const Image< tiled2d<T> >& ima, const std::string& filename);
00079 #endif
00080
00081
00082 # ifndef MLN_INCLUDE_ONLY
00083
00084 namespace impl
00085 {
00086
00087 inline
00088 Magick::Color get_color(bool value)
00089 {
00090 return Magick::ColorMono(value);
00091 }
00092
00093 inline
00094 Magick::Color get_color(const value::int_u8& value)
00095 {
00096
00097
00098
00099
00100
00101 return Magick::Color
00102 (value << 8 * (sizeof(Magick::Quantum) - sizeof(value::int_u8)),
00103 value << 8 * (sizeof(Magick::Quantum) - sizeof(value::int_u8)),
00104 value << 8 * (sizeof(Magick::Quantum) - sizeof(value::int_u8)));
00105 }
00106
00107 inline
00108 Magick::Color get_color(const value::rgb8& value)
00109 {
00110
00111
00112
00113
00114
00115
00116 return Magick::Color
00117 (value.red() << 8 * (sizeof(Magick::Quantum)
00118 - sizeof(value::rgb8::red_t)),
00119 value.green() << 8 * (sizeof(Magick::Quantum)
00120 - sizeof(value::rgb8::green_t)),
00121 value.blue() << 8 * (sizeof(Magick::Quantum)
00122 - sizeof(value::rgb8::blue_t)));
00123 }
00124
00125 }
00126
00127
00128 template <typename I>
00129 inline
00130 void
00131 save(const Image<I>& ima_, const std::string& filename)
00132 {
00133 trace::entering("mln::io::magick::save");
00134
00135 mln_precondition(mln_site_(I)::dim == 2);
00136
00137 if (!(mln::metal::equal<mln_value(I), bool>::value ||
00138 mln::metal::equal<mln_value(I), value::int_u8>::value ||
00139 mln::metal::equal<mln_value(I), value::rgb8>::value ||
00140 mln::metal::equal<mln_value(I), value::qt::rgb32>::value))
00141 {
00142 std::cerr <<
00143 "error: trying to save an unsupported format\n"
00144 "supported formats are:\n"
00145 " binary (bool)\n"
00146 " 8-bit grayscale (mln::value::int_u8)\n"
00147 " 3x8-bit truecolor (rgb8)" << std::endl;
00148 abort();
00149 }
00150
00151 const I& ima = exact(ima_);
00152
00153 Magick::Image magick_ima;
00154
00155
00156
00157 magick_ima.size(Magick::Geometry(ima.ncols(), ima.nrows()));
00158
00159 Magick::Pixels view(magick_ima);
00160
00161 Magick::PixelPacket* pixels = view.get(0, 0, ima.ncols(), ima.nrows());
00162 mln_piter(I) p(ima.domain());
00163 for_all(p)
00164 *pixels++ = impl::get_color(ima(p));
00165
00166 view.sync();
00167 magick_ima.write(filename);
00168
00169 trace::exiting("mln::io::magick::save");
00170 }
00171
00172
00173
00174 #if 0
00175 template <typename T>
00176 void
00177 save(const Image< tiled2d<T> >& ima_, const std::string& filename)
00178 {
00179 trace::entering("mln::io::magick::save");
00180
00181 tiled2d<T>& ima = exact(ima_);
00182
00183 ima.buffer().write(filename);
00184
00185 trace::exiting("mln::io::magick::save");
00186 }
00187 #endif
00188
00189
00190 # endif // ! MLN_INCLUDE_ONLY
00191
00192 }
00193
00194 }
00195
00196 }
00197
00198
00199 #endif // ! MLN_IO_MAGICK_SAVE_HH