«Magick ++ :: readImages» выдает предупреждение, когда я вызываю его для декодирования изображения png внутри объекта Blob - PullRequest
0 голосов
/ 16 октября 2019

Я использую Magick ++ для обработки изображений, коды ниже выдают предупреждение: "Magick: iCCP: известен неправильный профиль sRGB (), о котором сообщило coders / png.c: 1105 (PNGWarningHandler)"

......
string img;
//assign image to this string(img)
std::list<Image> m_images;
......
Blob src_blob(image.data(), image.length());
readImages(&m_images, src_blob);//in this function throw a warning exception
if (!m_images.empty()) {
    Image image = *(m_images.begin());
}
......

Но если я сконструирую Image следующим образом:

Blob src_blob(image.data(), image.length());
Image image(src_blob);

, коды будут работать, и не будет исключений броска

идентификатор этого изображения:

$identify case1.png
case1.png PNG 800x800 800x800+0+0 8-bit sRGB 807280B 0.000u 0:00.004

(я должен использовать readImages , потому что я могу обработать изображение gif)

1 Ответ

1 голос
/ 16 октября 2019

Попробуйте следующее ...

std::list<Image> m_images;
// ...
ReadOptions opts;
opts.quiet(true);
Blob src_blob(image.data(), image.length());
readImages(&m_images, src_blob, opts);

Установка ReadOptions.quiet на true подавит любые предупреждения во время декодирования.

// From `Magick::throwException` method.
if ((quiet_) && (severity < MagickCore::ErrorException))
{
  delete nestedException;
  return;
}

Но если я сконструирую Image следующим образом:

Blob src_blob(image.data(), image.length());
Image image(src_blob);

, коды будут работать и исключение не будет

Это потому, чтометод конструктор-помощник временно устанавливает quiet для удобства.

// From Image.cpp
Magick::Image::Image(const Blob &blob_)
  : _imgRef(new ImageRef)
{
  try
  {
    // Initialize, Allocate and Read images
    quiet(true);
    read(blob_);
    quiet(false);
  }
  catch (const Error&)
  {
    // Release resources
    delete _imgRef;
    throw;
  }
}
...