Justamente los comentarios de la cabecera explican su uso, pero básicamente hay que llamar a la macro HEADER_PIXEL. Algo así:
Una vez que llamas a HEADER_PIXEL, pixel[0], pixel[1] y pixel[2] contendrán los valores para los componentes rojo, verde y azul, en ese orden, del primer pixel. La siguiente vez que llames a HEADER_PIXEL, los valores de pixel serán actualizados a los del siguiente pixel y así sucesivamente.
Pero realmente es un "formato" feo y no muy eficiente. Tienes que llamar a esa macro que hace operaciones a nivel de bits porque los valores RGB se almacenan de tal manera que cada byte guardado sea un caracter ASCII imprimible, por lo que ocupan parte de un byte, y parte de otro. Te recomendaría que consideres usar algún formato de verdad. Por ejemplo, el BMP es tan simple que escribir una función que lo lea es una tarea prácticamente trivial; ni siquiera hace falta recurrir a bibliotecas externas.
Código (c) [Seleccionar]
char pixel[3];
char *datos = header_data;
...
HEADER_PIXEL(data, pixel)
Una vez que llamas a HEADER_PIXEL, pixel[0], pixel[1] y pixel[2] contendrán los valores para los componentes rojo, verde y azul, en ese orden, del primer pixel. La siguiente vez que llames a HEADER_PIXEL, los valores de pixel serán actualizados a los del siguiente pixel y así sucesivamente.
Pero realmente es un "formato" feo y no muy eficiente. Tienes que llamar a esa macro que hace operaciones a nivel de bits porque los valores RGB se almacenan de tal manera que cada byte guardado sea un caracter ASCII imprimible, por lo que ocupan parte de un byte, y parte de otro. Te recomendaría que consideres usar algún formato de verdad. Por ejemplo, el BMP es tan simple que escribir una función que lo lea es una tarea prácticamente trivial; ni siquiera hace falta recurrir a bibliotecas externas.