С++ Преобразование изображения в целочисленный массив

Как мне преобразовать пиксели изображения (файл .png) в целочисленный массив, где каждый пиксель преобразуется в целочисленный эквивалент ARGB? Между прочим, не двумерный целочисленный массив, а одномерный (где доступ осуществляется через массив [строка * ширина + столбец]).

Спасибо.


person jonathanasdf    schedule 17.04.2010    source источник
comment
Если вы действительно хотите сделать это без сторонних библиотек, вы захотите подружиться со спецификацией PNG: w3.org/TR/PNG. После прочтения этого (и связанных с ним материалов) это всего лишь небольшой вопрос программирования.   -  person James McNellis    schedule 17.04.2010
comment
Советую не приближаться к психиатрическим клиникам, а то застрянешь.   -  person jweyrich    schedule 18.04.2010
comment
@jweyrich, что ты имеешь в виду? @Джеймс, спасибо, я проверю.   -  person jonathanasdf    schedule 18.04.2010
comment
@jonathanasdf Я просто пошутил. Безумие не использовать libpng или другую библиотеку для распаковки изображения. Например, libpng даст вам буфер [ширина * высота * каналы].   -  person jweyrich    schedule 18.04.2010
comment
да, я, очевидно, не знал, во что ввязываюсь :P Я просто хотел узнать, как это работает за кулисами, но я думаю, что для меня еще слишком рано, лол. Думаю, я пойду с libpng.   -  person jonathanasdf    schedule 18.04.2010
comment
Если вы хотите поэкспериментировать с базовой обработкой изображений, вы можете попробовать использовать формат PBM — это, по сути, необработанные несжатые пиксельные данные, записанные очень простым способом, с небольшим количеством данных заголовка, поэтому самостоятельно читать/записывать изображения из кода тривиально. . Ищите IrfanView как средство просмотра изображений для формата (и всего остального на свете!). netpbm.sourceforge.net/doc/pbm.html   -  person tzaman    schedule 18.04.2010


Ответы (2)


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

GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ("image.png", NULL);
unsigned char *pixels = gdk_pixbuf_get_pixels (pixbuf);
int *array = reinterpret_cast<int*>(pixels);

В примере используется библиотека GdkPixbuf, но другие библиотеки должны быть похожими.

person el.pescado    schedule 17.04.2010

Если вы не делаете это для интереса и обучения, я бы рекомендовал вам использовать стороннюю библиотеку, например ImageMagick.
Это сэкономит ваше время (и позволит избежать ошибок)

person hamishmcn    schedule 17.04.2010
comment
Проходит время, и теперь существует более одного API для ImageMagick. C++ — это Magick++. - person Hastur; 17.02.2015