Вы можете хранить прозрачность в отдельной памяти или даже хранить каждый канал отдельно, например ::100100
struct bitmap {
uint8_t *red;
uint8_t *green;
uint8_t *blue;
uint8_t *transparency;
// or packed: uint8_t *RGB, *transparency;
size_t width;
size_t height;
};
Затем выделите width*height / 8
байтов для канала прозрачности, и, предполагая, что 8 бит на канал цвета, вы можете получить доступ к битам следующим образом:
bool get_transparency( struct bitmap* bmp, size_t x, size_t y ) {
size_t idx = y * bmp->width + x;
size_t tidx = idx >> 3; // = idx / 8
uint8_t t8 = (uint8_t)( idx & 7 ); // = idx % 8
uint8_t mask = 1 << t8;
return ( bmp->transparency[tidx] & mask ) != 0;
}
Обратите внимание, доступ к битам можно оптимизировать, это только пример.
Другое решение: вы можете провести немного по одному из цветовых каналов и определить свою структуру следующим образом:
struct RGBPixel {
uint8_t red : 7;
uint8_t transparency : 1;
uint8_t green;
uint8_g blue;
};
При сохранении или чтении красного канала вы должны соответственно масштабироваться, например, red = (uint8_t)( ( (uint16_t)pix->red * 8 ) / 7 );