Dernièrement, j'ai été intéressé par la représentation des bitmaps non compressés en mémoire. Cependant, une chose dont je ne suis pas sûr comment implémenter correctement est la transparence binaire. Par exemple, je commence avec quelque chose comme ceci:Comment représenter la transparence binaire?
struct RGBPixel {
uint8_t red;
uint8_t green;
uint8_t blue;
};
struct bitmap {
struct RGBPixel *data;
size_t width;
size_t height;
size_t bytesPerPixel;
size_t bytewidth;
/* etc. */
};
Je suppose que la façon la plus simple serait:
struct RGBPixel {
uint8_t red;
uint8_t green;
uint8_t blue;
bool transparent;
};
Mais cela semble un peu inutile (vous pourriez aussi bien ajouter un canal alpha complet) . La seule autre possibilité que je peux penser est de réserver l'une des couleurs comme étant transparente, mais ensuite vous perdez la capacité d'afficher cette couleur. Existe-t-il un moyen standard de le faire?
Comment les formats courants (GIF, PNG 8 bits, etc.) représentent-ils cela?
"il suffit de choisir celui qui n'est pas utilisé et en faire la couleur de transparence." Mais comment puis-je choisir cette couleur? Boucle à travers l'image et continuer à deviner une couleur jusqu'à ce que je trouve celui qui n'est pas utilisé? – Sam
Commencez avec une couleur qui, selon vous, ne sera pas utilisée. En boucle, s'il est utilisé, souvenez-vous du décalage avec le pixmap où vous êtes, changez légèrement la couleur (peut-être incrémentez la valeur B, passez de G à R selon le cas) puis bouclez jusqu'à la fin du pixmap et commencez au début, si vous ne trouvez pas cette couleur, c'est celle-là. Sinon, répétez. Pour améliorer les performances du boîtier d'angle, sélectionnez 256 couleurs qui, selon vous, ne seront pas utilisées au démarrage et recherchez-les simultanément. Les chances de trouver tout sont en cours d'utilisation est assez faible, dans une image 4MP, c'est 1/4^256 ou environ 1 en 1e25. –