Предполагая, что изображение имеет размер w * h пикселей и хранится в истинном «упакованном» формате RGB без альфа-компонента, каждому пикселю потребуется три байта.
В памяти первая строка изображения может быть представлена в удивительной графике ASCII, например:
R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1)
Здесь каждый R n G n и B n представляет один байт, давая красный, зеленый или синий компонент пикселя n этой линии сканирования. Обратите внимание, что порядок байтов может отличаться для разных «сырых» форматов; нет согласованного мирового стандарта. Различные среды (видеокарты, камеры, ...) делают это по-разному, по какой-то причине, вы просто должны знать макет.
Считывание пикселя может быть затем выполнено с помощью этой функции:
typedef unsigned char byte;
void get_pixel(const byte *image, unsigned int w,
unsigned int x,
unsigned int y,
byte *red, byte *green, byte *blue)
{
/* Compute pointer to first (red) byte of the desired pixel. */
const byte * pixel = image + w * y * 3 + 3 * x;
/* Copy R, G and B to outputs. */
*red = pixel[0];
*green = pixel[1];
*blue = pixel[2];
}
Обратите внимание, что высота изображения не требуется для этого, и как функция не нуждается в проверке границ. Функция качества производства может быть более бронированной.
Обновление Если вы беспокоитесь, что этот подход будет слишком медленным, вы, конечно, можете просто зациклить пиксели:
unsigned int x, y;
const byte *pixel = /* ... assumed to be pointing at the data as per above */
for(y = 0; y < h; ++y)
{
for(x = 0; x < w; ++x, pixel += 3)
{
const byte red = pixel[0], green = pixel[1], blue = pixel[2];
/* Do something with the current pixel. */
}
}