Ошибка Magick++ при чтении BLOB в изображение

Я пытаюсь экспортировать изображение из необработанных пиксельных данных в RGBA PNG, используя библиотеку Magick++.

Однако при попытке запустить я получаю странную ошибку:

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`

person s3lph    schedule 28.03.2015    source источник
comment
Вы используете версию ImageMagick Q8 или Q16?   -  person dlemstra    schedule 28.03.2015


Ответы (1)


Ваш пример работает, если вы используете версию Q8 ImageMagick. Но похоже, что вы используете версию ImageMagick Q16. Последний использует 16 бит на канал пикселя. Вы используете vector‹unsigned char›, который состоит всего из 8 бит. Я бы посоветовал вам переключиться на vector‹unsigned short› или использовать vector‹unsigned char›, размер которого в два раза больше текущего. Вы также можете переключиться на версию Q8 ImageMagick, если вам не нужны 16 бит на пиксельный канал.

person dlemstra    schedule 29.03.2015
comment
Я остался с unsigned char, но заменил *4 на *8 - person s3lph; 29.03.2015
comment
или вы можете указать глубину цвета изображения перед его чтением - img.depth(8); - person Karry; 03.12.2015