Как создать заголовки BMP растрового изображения в потоке памяти с помощью GraphicsMagick?

У меня есть массив в памяти, который содержит растровое изображение, с известным размером, глубиной, палитрой и тому подобное. Я хочу использовать этот массив, чтобы создать представление GraphicsMagick для изображения, чтобы я мог написать этот файл с его заголовком BMP и сделать возможным его просмотр с помощью другого программного обеспечения.

Пока что у меня есть что-то вроде этого (только важные строки - я мог бы добавить всю программу по запросу). Сначала переменные:

FILE *fp_out;
ExceptionInfo exception;
Image *image;
ImageInfo *image_info;
char buffer[BUFFER_SIZE] = {0};
const int w = WIDTH, h = HEIGHT;

И соответствующий код:

image = ConstituteImage(w, h, "RGB", CharPixel, buffer, &exception);
image_info = CloneImageInfo((ImageInfo *) NULL);
fp_out = fopen("image.bmp", "wb");
image_info->file = fp_out;
WriteImage(image_info, image);

Файл image.bmp создается, но заголовка BMP просто нет, и первые байты этого растрового изображения содержат что-то вроде этого:

id=ImageMagick  version=1.0
class=DirectClass  matte=False
columns=74  rows=75  depth=8
<binary data of my image>

Что я делаю неправильно? На какие части документации мне следует обратить внимание? Это довольно подавляюще.

1 ответ

В качестве выходного формата использовался формат MIFF по умолчанию. Чтобы это исправить, вы можете сделать

image = ConstituteImage(w, h, "RGB", CharPixel, buffer, &exception);
image_info = CloneImageInfo((ImageInfo *) NULL);
fp_out = fopen("image.bmp", "wb");
image_info->file = fp_out;
strcpy(image_info->magick,"BMP");
WriteImage(image_info, image);

или сделать (более нормальный способ)

image = ConstituteImage(w, h, "RGB", CharPixel, buffer, &exception);
image_info = CloneImageInfo((ImageInfo *) NULL);
strcpy(image->filename,"image.bmp");
WriteImage(image_info, image);
Другие вопросы по тегам