Source:Récupérer une des valeurs RGB sur un pixel.cpp


/****************************************************************/
/*    Titre: Récupérer une des valeurs RGB à partir d'un pixel
/*    Auteur: Corkus
/*    But: Après avoir créer une surface avec plusieurs couleurs,
/*         On récupère la valeur Rouge.
/****************************************************************/
 
#include "sdl.h"
#include <iostream>
 
/* SDL prend pour acquis que chaque pixel est un entier sur 32bits, alors nos masques doivent
correspondre à l'ordre que donne l'ordinateur aux octets */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
#define RMASK 0xff000000
#define GMASK 0x00ff0000
#define BMASK 0x0000ff00
#define AMASK 0x00000000
#else //SDL_BYTEORDER == SDL_BIG_ENDIAN
#define RMASK 0x000000ff
#define GMASK 0x0000ff00
#define BMASK 0x00ff0000
#define AMASK 0x00000000
#endif //SDL_BYTEORDER == SDL_BIG_ENDIAN
 
int main(int argc, char* argv[])
{
	SDL_Init(SDL_INIT_VIDEO);
 
	SDL_Surface* Fenetre;
	SDL_Surface* CarreRouge;
 
	Fenetre = SDL_SetVideoMode(800,600,32, SDL_SWSURFACE | SDL_DOUBLEBUF);
 
        /* On applique les bons masques à chaque valeur */
	CarreRleu = SDL_CreateRGBSurface
			(SDL_SWSURFACE, 800, 600, 32, 
			RMASK, GMASK, BMASK, AMASK);
 
        /* Remplit la surface de vert avec un peu de rouge */
	SDL_FillRect(carrebleu,NULL,SDL_MapRGBA(carrebleu->format,10,255,0,255));
 
        /* Contiendra la valeur du Rouge après avoir passé devant le masque */
	Uint32 temp;
        /* Récupère un pixel de la Surface */
        Uint32 pixel;
 
        /* La surface doit être vérouiller pour pouvoir récupérer un pixel */
	SDL_LockSurface(carrebleu);
 
        /* Récupère un pixel */
	pixel = *((Uint32*)carrebleu->pixels);
 
	/*****************************************************************************
	Fontionnement du procéder:
 
	Pour récupérer la valeur du Rouge, ils faut enlever les autres couleurs.
	Pour cela on va utiliser l'opérateur binaire AND ( & ).
        Tout d'abord, il nous faut la valeur de notre pixel et de notre masque en binaire.
	Donc, on a la valeur de notre pixel, soit 65290
	qui, en binaire, vaut : 1111 1111 0000 1010b.
	Ensuite, regardons la valeur de notre masque :
	255 soit 1111 1111b.
	Une fois que nous avons nos deux valeurs,
	on va effacer les bits qui ne sont pas la valeur du Rouge.
	Pour qu'un bit ne soit pas désactivé, il doit être à 1 sur les 2 valeurs
	Dans le masque, seul les bits de la valeur Rouge sont activé.
	donc, seul les bits de la valeur Rouge resteront activés.
 
	1111 1111 0000 1010b
	& 0000 0000 1111 1111b
	______________________
	  0000 0000 0000 1010b
 
	Ce qui donne 1010b ou 10 en décimal. 
	La même valeur que celle donnée au SDL_CreateRGBSurface().
	******************************************************************************/
	temp = pixel & carrebleu->format->Rmask;//Effectue ce qui est dit ci dessus.
 
	/* Affichage des valeurs */
	std::cout << temp << "\t" << pixel << "\t" << carrebleu->format->Rmask << std::endl;
}