|
Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2026 mgr Jerzy Wałaszek
|
SDL_PixelFormat
| SPIS TREŚCI |
Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.
Struktura zawiera informację o formacie pikseli.
| Uint32 | format | jedna z wartości SDL_PixelFormatEnum. |
| SDL_Palette* | palette | struktura SDL_Palette skojarzona z tym formatem pikseli lub NULL, jeśli format nie posiada palety. |
| Uint8 | BitsPerPixel | liczba znaczących bitów w wartości piksela, np.: 8, 15, 16, 24, 32. |
| Uint8 | BytesPerPixel | liczba bajtów na przechowywanie wartości piksela, np.: 1, 2, 3, 4; zobacz do Uwag. |
| Uint32 | Rmask | maska reprezentująca położenie składowej czerwonej w pikselu. |
| Uint32 | Gmask | maska reprezentująca położenie składowej zielonej w pikselu. |
| Uint32 | Bmask | maska reprezentująca położenie składowej niebieskiej w pikselu. |
| Uint32 | Amask | maska reprezentująca położenie składowej alfa w pikselu lub 0, jeśli format pikseli nie posiada informacji o przezroczystości. |
| Uint8 | Rloss | (użytek wewnętrzny). |
| Uint8 | Gloss | (użytek wewnętrzny). |
| Uint8 | Bloss | (użytek wewnętrzny). |
| Uint8 | Aloss | (użytek wewnętrzny). |
| Uint8 | Rshift | (użytek wewnętrzny). |
| Uint8 | Gshift | (użytek wewnętrzny). |
| Uint8 | Bshift | (użytek wewnętrzny). |
| Uint8 | Ashift | (użytek wewnętrzny). |
| int | refcount | (użytek wewnętrzny). |
| SDL_PixelFormat* | next | (użytek wewnętrzny). |
Najłatwiejsze do zrozumienia są 8-bitowe formaty pikseli. Ponieważ jest to format 8-bitowy, pole BitsPerPixel ma wartość 8, a BytesPerPixel ma wartość 1. Ponieważ BytesPerPixel wynosi 1, wszystkie piksele są reprezentowane przez typ Uint8, który zawiera indeks w tablicy palette->colors. Zatem, aby określić kolor piksela na 8-bitowej powierzchni, odczytujemy indeks koloru z surface->pixels i uzywamy tego indeksu do odczytu struktury SDL_Color z surface->format->palette->colors. Na przykład tak:
SDL_Surface *surface;
SDL_PixelFormat *fmt;
SDL_Color *color;
Uint8 index;
.
.
/* Utwórz powierzchnię */
.
.
fmt=surface->format;
/* Sprawdź głębię bitową powierzchni */
if(fmt->BitsPerPixel!=8){
fprintf(stderr, "Not an 8-bit surface.\n");
return(-1);
}
/* Zablokuj powierzchnię */
SDL_LockSurface(surface);
/* Pobierz górny lewy piksel */
index=*(Uint8 *)surface->pixels;
color=&fmt->palette->colors[index];
/* Odblokuj powierzchnię */
SDL_UnlockSurface(surface);
printf("Pixel Color-> Red: %d, Green: %d, Blue: %d. Index: %d\n",
color->r, color->g, color->b, index);
.
.
|
Formaty pikseli powyżej 8 bitów są zupełnie inne. Traktuje się je jako formaty "TrueColor", a informacja o kolorze przechowywana jest w samych pikselach, a nie w palecie. Pola mask, shift i loss informują nas o sposobie kodowania kolorów. Pola mask pozwalają na wyodrębnienie każdej ze składowych kolorów, pola shift informują nas o liczbie bitów na prawo od kazdej składowej w wartości piksela, a pola loss informują nas o liczbie bitów traconych z każdej składowej, przy umieszczaniu 8-bitowej składowej koloru w kodzie piksela.
/* Wydobywanie składowych koloru z 32-bitowej wartości koloru */
SDL_PixelFormat *fmt;
SDL_Surface *surface;
Uint32 temp, pixel;
Uint8 red, green, blue, alpha;
.
.
.
fmt = surface->format;
SDL_LockSurface(surface);
pixel = *((Uint32*)surface->pixels);
SDL_UnlockSurface(surface);
/* Pobierz składową czerwoną */
temp = pixel & fmt->Rmask; /* Wyodrębnij składową czerwoną */
temp = temp >> fmt->Rshift; /* przesuń ją w dół do 8 bitów */
temp = temp << fmt->Rloss; /* Poszerz na pełną 8-bitową liczbę */
red = (Uint8)temp;
/* Pobierz składową zieloną */
temp = pixel & fmt->Gmask; /* Wyodrębnij składową zieloną */
temp = temp >> fmt->Gshift; /* przesuń ją w dół do 8 bitów */
temp = temp << fmt->Gloss; /* Poszerz na pełną 8-bitową liczbę */
green = (Uint8)temp;
/* Pobierz składową niebieską */
temp = pixel & fmt->Bmask; /* Wyodrębnij składową niebieską */
temp = temp >> fmt->Bshift; /* przesuń ją w dół do 8 bitów */
temp = temp << fmt->Bloss; /* Poszerz na pełną 8-bitową liczbę */
blue = (Uint8)temp;
/* Pobierz składową alfa */
temp = pixel & fmt->Amask; /* Wyodrębnij składową alfa */
temp = temp >> fmt->Ashift; /* przesuń ją w dół do 8 bitów */
temp = temp << fmt->Aloss; /* Poszerz na pełną 8-bitową liczbę */
alpha = (Uint8)temp;
printf("Pixel Color -> R: %d, G: %d, B: %d, A: %d\n", red, green, blue, alpha);
.
.
.
|
Format pikseli posiada albo paletę, albo maski. Jeśli jest używana paleta, pola Rmask, Gmask, Bmask i Amask będą miały wartość 0.
Typy danych dla pikseli są następujące:
| Bajty na piksel | Powiązany typ danych |
| 1 | Uint8 |
| 2 | Uint16 |
| 3 | krotka wartości RGB Uint8 |
| 4 | Uint32 |
Struktura SDL_PixelFormat opisuje format danych pikseli przechowywanych w polu pixels struktury SDL_Surface. Każda powierzchnia przechowuje strukturę SDL_PixelFormat w polu format.
Jeśli zamierzasz dokonywać manipulacji na pikselach powierzchni graficznej, to niezbędne staje się zrozumienie, w jaki sposób SDL przechowuje informacje o ich kolorach. Zobacz na przykładowe kody przedstawione powyżej.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.