Получение значений RGB каждого пикселя в GIF-файле

Я пытаюсь изучить Magick ++ и, в частности, способ вывода значений RGB для каждого пикселя изображения. Здесь у меня есть GIF-файл и следующий код C ++ для достижения этой цели. По некоторым причинам он генерирует в основном триплеты 0 с редкими экземплярами некоторых нежелательных значений, которые не представляют фактические цвета изображения. Что я делаю неправильно?

Ссылка на изображение

#include <Magick++.h>
#include <iostream>

using std::cout;
using std::endl;
using namespace Magick;

int main()
{
Image image("forest.gif");
image.modifyImage();
image.type(TrueColorType);
int nx = image.columns();
int ny = image.rows();

PixelPacket *pixel_cache = image.getPixels(0,0,nx,ny);
for (int i = 0; i < nx; ++i)
{
for (int j = 0; j < ny; ++j)
{
PixelPacket* pix = pixel_cache + j*nx + i;
cout << pix->red << " " << pix->green << " " << pix->blue << endl;
}
}

return 0;
}

0

Решение

Похоже, проблема в j*nx + i,
Вы перебираете столбцы в цикле i for, а затем через строки в цикле j for. Я ожидаю, что значения в памяти хранятся в порядке строк, поэтому я настоятельно рекомендую поменять местами циклы, чтобы вы перебирали строки во внешнем цикле и столбцах во внутреннем цикле.
В любом случае, однако, если изображение не хранится в памяти в порядке столбцов (я не знаю Magick ++, но думаю, что это крайне маловероятно), j * nx обычно указывает на область памяти вне фактического изображения — Таким образом, мусорные данные.

Просто поменяйте местами переменные

for (int i = 0; i < ny; ++i)
{
for (int j = 0; j < nx; ++j)
{
PixelPacket* pix = pixel_cache + i*ny + j;
cout << pix->red << " " << pix->green << " " << pix->blue << endl;
}
}
0

Другие решения

вы можете попробовать записать изображение в простой буфер, после чего вы можете легко получить доступ к данным

char buffer[image.columns()*image.rows()*3];
image.write(0, 0, image.columns(), image.rows(), "RGB", Magick::CharPixel, buffer);
0

По вопросам рекламы [email protected]