Сохранить монтаж в BLOB с помощью Magick++

У меня есть монтаж, и я могу сохранить его на диск, если указан путь назначения. Однако, когда я пытаюсь сохранить его в большой двоичный объект, это не удается.

Я пропустил некоторые настройки?

Версия: ImageMagick 6.8.2-5 2013-02-05 Q8

Машина: Windows 7 x64

EDIT: Исключение:

Unhandled Exception: System.Runtime.InteropServices.SEHException: External component has thrown an exception.
   at Magick.throwException(_ExceptionInfo* )
   at Magick.writeImages<class std::_List_iterator<class std::_List_val<class Magick::Image,class std::allocator<class Magick::Image> > > >
   (_List_iterator<std::_List_val<Magick::Image\,std::allocator<Magick::Image> > > first_, _List_iterator<std::_List_val<Magick::Image\,std::allocator<Magick::Image
   > > > last_, Blob* blob_, Boolean adjoin_) in d:\dev\projects\ecs\layers\tools\imagemagicknet\include8\magick++\stl.h:line 2562

Исходные изображения

Код:

   void test()
   {
      list<Magick::Image> sourceImageList;
      Magick::Image image;

      image.read("d:\\imtest\\Montage\\1.jpg");
      sourceImageList.push_back(image);
      image.read("d:\\imtest\\Montage\\2.jpg");
      sourceImageList.push_back(image);
      image.read("d:\\imtest\\Montage\\3.jpg");
      sourceImageList.push_back(image);

      Magick::Color color("rgba(0,0,0,0)");

      Montage montageSettings;
      montageSettings.geometry("100x100-0-0");
      montageSettings.shadow(true);
      montageSettings.backgroundColor(color);
      montageSettings.tile( "3x1" );

      list<Magick::Image> montagelist;
      Magick::montageImages( &montagelist, sourceImageList.begin(), sourceImageList.end(), montageSettings);

      // This will give the expected result
      Magick::writeImages(montagelist.begin(), montagelist.end(), "d:\\imtest\\Montage\\out.png");

      Magick::Blob *b = new Magick::Blob();
      // This will throw an exception mentioned above
      Magick::writeImages(montagelist.begin(), montagelist.end(), b);
      Magick::Image imageFromBlob(*b);
      imageFromBlob.write("d:\\imtest\\Montage\\outBlob.png");

   }

person jani    schedule 12.02.2013    source источник
comment
blob* b не инициализирован и содержит случайные данные. Что вы ожидаете?   -  person Mahmoud Al-Qudsi    schedule 12.02.2013
comment
@ Махмуд Аль-Кудси Спасибо! Извините, я скопировал неправильные строки. Смотрите отредактировано.   -  person jani    schedule 12.02.2013
comment
Спасибо за ваш код! Это единственный пример монтажа изображений в Magick++, который я нашел, и он прекрасно работает!   -  person spacer GIF    schedule 09.03.2020


Ответы (1)


Вы должны добавить блоки try/catch для исключений, чтобы исключение было перехвачено и могло быть диагностировано (например, вывод исключения в stderr, чтобы можно было увидеть «какую» строку). Невозможно диагностировать необработанное исключение.

Правильный способ обработки исключений, создаваемых Magick++, подробно описан в [Magick::Exception].1

person Bob Friesenhahn    schedule 17.02.2013