Создайте новое изображение с помощью Magick++

У меня есть вектор что-то в этом роде

typedef struct
{
  int r,g,b;
} __attribute__((__packed__))
rgbs;

vector<rgbs> rgbt;

rgbs rgb;
for(int row=0;row<100; row++)
{
  for(int col=0;col<100; col++)
  {
     rgb.r=col+row;
     rgb.g=col+row;
     rgb.b=col+row;
     rgbt.push_back(rgb);
  }
}

Каким будет эффективный способ формирования нового изображения из этого вектора с помощью magick++;

2 ответа

Решение

Zaffy был прав::

32-разрядное целое число не может использоваться в этом случае, так как размер указателя пакета пикселя на красный, синий или зеленый пиксель равен 16 битам.

Итак, нам нужно использовать 16-битное целое число без знака из библиотеки stdint

#include<stdint.h>
typedef uint16_t WORD;

Теперь в структуре rgbs вместо этого мы инициализируем WORD r,g,b.

Способ инициализации Blob: Blob blob(адрес пиксельных данных, размер данных) Итак, код будет выглядеть примерно так:

Blob blob(&rgbt[0],(rgbt.size()*sizeof(rgbt[0]));
Image image;
image.size("100x100");
image.magick("RGB");
image.read(blob);

Я настроил для вас пример из документации по API Magick ++.

Blob blob( &rgbt[0], rgbt.size() / sizeof(rgbt[0]) );
Image image;
image.size( "100x100") 
image.magick( "RGB" ); 
image.read( blob);

Но я не уверен, стоит ли использовать один байт unsigned char вместо 4 байтов int, Попробуйте, и вы увидите.

Другие вопросы по тегам