【问题标题】:Magick++ Error when reading BLOB into Image将 BLOB 读入图像时出现 Magick++ 错误
【发布时间】:2015-03-28 19:18:52
【问题描述】:

我正在尝试使用 Magick++ 库将图像从原始像素数据导出到 RGBA PNG。

但是,当我尝试运行它时遇到了一个奇怪的错误:

terminate called after throwing an instance of 'Magick::ErrorCorruptImage'
  what():  test: unexpected end-of-file `': No such file or directory @ error/rgb.c/ReadRGBImage/229
Aborted

这是相关的代码部分(我省略了填充像素向量,但这并没有改变任何东西):

#include <iostream>
#include <vector>
#include <ImageMagick/Magick++.h>

using namespace std;

int main(int argc, char *argv[]) {
    Magick::InitializeMagick(*argv);
    int rres, ires;
    cin >> rres >> ires;
    //RGBA
    //rres: horiz. resolution, ires: vert. resolution
    vector<unsigned char> image(rres * ires * 4);
    Magick::Blob blob(&image[0], rres*ires*4);
    Magick::Image img;
    img.size(to_string(rres) + "x" + to_string(ires));
    img.magick("RGBA");
    img.read(blob);
    img.write("out.png");
}

编译:

g++ --std=c++11 -O0 -g3 -ggdb3 -D_GLIBCXX_DEBUG -Wall test.cpp -o test `Magick++-config --cppflags --cxxflags --ldflags --libs`

【问题讨论】:

  • 您使用的是 Q8 还是 Q16 版本的 ImageMagick?
  • Version: ImageMagick 6.7.7-10 2014-03-06 Q16

标签: c++ magick++


【解决方案1】:

如果您使用的是 Q8 版本的 ImageMagick,则您的示例有效。但是您似乎使用的是 Q16 版本的 ImageMagick。后者每个像素通道使用 16 位。您正在使用只有 8 位的 vector 。我建议您切换到 vector 或使用两倍于当前大小的 vector。如果您不需要每像素通道 16 位,您也可以切换到 Q8 版本的 ImageMagick。

【讨论】:

  • 我留在unsigned char,但将*4替换为*8
  • 或者您可以在阅读之前指定图像颜色深度 - img.depth(8);
猜你喜欢
  • 2011-10-21
  • 2017-09-30
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-09-07
  • 2020-01-06
相关资源
最近更新 更多