diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-11-14 21:58:47 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-11-14 21:58:47 +0000 |
| commit | 967dc3f4461d4b8caf809ebce7bdcb6e818809f0 (patch) | |
| tree | c599bad3a8a3797ccdc3d25963059a668baa6649 /src/lib/imagemagick_decoder.cc | |
| parent | 05c37b9bb09f7bfa4c2ec8ea6b3fa4a83d0fec20 (diff) | |
Use ImageMagick for tiff decoding too.
Diffstat (limited to 'src/lib/imagemagick_decoder.cc')
| -rw-r--r-- | src/lib/imagemagick_decoder.cc | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/src/lib/imagemagick_decoder.cc b/src/lib/imagemagick_decoder.cc index 53e1db879..7faf74c61 100644 --- a/src/lib/imagemagick_decoder.cc +++ b/src/lib/imagemagick_decoder.cc @@ -18,10 +18,12 @@ */ #include <iostream> +#include <boost/filesystem.hpp> #include <Magick++.h> #include "imagemagick_decoder.h" #include "image.h" #include "film.h" +#include "exceptions.h" using std::cout; using boost::shared_ptr; @@ -29,49 +31,76 @@ using boost::shared_ptr; ImageMagickDecoder::ImageMagickDecoder ( boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, Job* j) : Decoder (f, o, j) - , _done (false) { - _magick_image = new Magick::Image (_film->content_path ()); + if (boost::filesystem::is_directory (_film->content_path())) { + for ( + boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (_film->content_path()); + i != boost::filesystem::directory_iterator(); + ++i) { + + if (still_image_file (i->path().string())) { + _files.push_back (i->path().string()); + } + } + } else { + _files.push_back (_film->content_path ()); + } + + _iter = _files.begin (); } Size ImageMagickDecoder::native_size () const { - return Size (_magick_image->columns(), _magick_image->rows()); + if (_files.empty ()) { + throw DecodeError ("no still image files found"); + } + + /* Look at the first file and assume its size holds for all */ + using namespace MagickCore; + Magick::Image* image = new Magick::Image (_film->content_path ()); + Size const s = Size (image->columns(), image->rows()); + delete image; + + return s; } bool ImageMagickDecoder::pass () { - using namespace MagickCore; - - if (_done) { + if (_iter == _files.end()) { return true; } + + using namespace MagickCore; + Magick::Image* magick_image = new Magick::Image (_film->content_path ()); + Size size = native_size (); shared_ptr<CompactImage> image (new CompactImage (PIX_FMT_RGB24, size)); uint8_t* p = image->data()[0]; for (int y = 0; y < size.height; ++y) { for (int x = 0; x < size.width; ++x) { - Magick::Color c = _magick_image->pixelColor (x, y); + Magick::Color c = magick_image->pixelColor (x, y); *p++ = c.redQuantum() * 255 / QuantumRange; *p++ = c.greenQuantum() * 255 / QuantumRange; *p++ = c.blueQuantum() * 255 / QuantumRange; } - } + + delete magick_image; emit_video (image); - _done = true; + ++_iter; return false; } PixelFormat ImageMagickDecoder::pixel_format () const { + /* XXX: always true? */ return PIX_FMT_RGB24; } |
