Zakładając, że obraz jest w * h pikseli i jest przechowywany w prawdziwym "zapakowanym" formacie RGB bez komponentu alfa, każdy piksel będzie wymagał trzech bajtów.
w pamięci pierwsza linia obrazu może być przedstawiony w niesamowite grafiki ASCII tak:
R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1)
Tutaj każdy R n G n i B n oznacza jeden bajt , podając czerwony, zielony lub niebieski komponent pikseli tej linii wzorcowej. Zauważ, że kolejność bajtów może być różna dla różnych "surowych" formatów; nie ma uzgodnionego standardu światowego. Różne środowiska (karty graficzne, aparaty fotograficzne, ...) robią to inaczej z jakiegokolwiek powodu, po prostu trzeba znać układ.
Odczyt piksel może być wykonane za pomocą tej funkcji:
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];
}
Wskazówki jak wysokość obrazu nie jest potrzebny do tego, aby pracować i jak funkcja jest wolny od ograniczeń zakresu kontroli. Funkcja jakości produkcji może być bardziej opancerzona.
Aktualizacja Jeśli martwisz to podejście będzie zbyt powolne, można oczywiście tylko pętla ciągu pikseli, zamiast:
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. */
}
}
Należy określić, w jaki sposób jest reprezentowany "surowy obraz" i jaki to jest format. – sharptooth
Zdefiniuj "obraz surowy". Czy to plik obrazu? Jeśli tak, jaki plik? Czy próbujesz zrobić zrzut ekranu?Edytuj swoje pytanie, aby dodać szczegóły. – Artelius
Jaki format jest twój "surowy" obraz. Czy to może być bitmapa lub plik graficzny pobrany z kamery? – ChrisBD