Signification de (& 0xff)

Résolu
hta9wa - 16 avril 2013 à 15:52
 Utilisateur anonyme - 16 avril 2013 à 22:40
Bonjour,
j’essaie de comprendre code 'filtre d'une image' en java android:
j'ai pas comprit la signification de (& 0xff) , ( >> 8) & 0xff), (>> 16) & 0xff) et (0xff000000).
merci de m'aider
le code est le suivant:

for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
{
     for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
     {
    	int accumR = 0;
    	int accumG = 0;
    	int accumB = 0;
    	for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
    	{
    		for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
    		{
    			int index = (y+dy)*width + (x+dx);
    			accumR += (pixOld[index] >> 16) & 0xff;
    			accumG += (pixOld[index] >> 8) & 0xff;
    			accumB += pixOld[index] & 0xff;
    		} //dx
    	} //dy
    
accumR /= filterArea;
accumG /= filterArea;
accumB /= filterArea;
int index = y*width + x;
pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
   } //x
} //y

3 réponses

Utilisateur anonyme
16 avril 2013 à 16:11
Bonjour

& est l'opérateur logique bit à bit ET. | est l'opérateur logique bit à bit OU. >> et << sont des opérateurs de décalage de bits. 0xff est une valeur hexadécimale (base 16, de 0 à f). Ce code du corps de la boucle prend un entier qui utilise 3 octets sur 4 pour les composantes R (rouge), G (vert = green), B (bleu). A la fin, l'entier en sortie reprend les valeurs accumulées, les replace au bon endroit dans les 3 octets pour qu'il soit bien compris comme une valeur RGB. On dirait un code de filtrage de correction gamma mais je n'en suis pas sûr à 100%. Bon courage.




































T.U.E.R (First Person Shooter créé par Julien Gouesse)
1
Merci pour ta réponse,
j'ai compris cette explication mais quelle est sa relation avec le filtre moyenne!!
voila tout le code du filtre, je n'en ai rien compris.
pouvez vous m'expliquer svp !!


	
private void moyenneFilter(int filterWidth, int filterHeight)
    {
    	// Create new array
    	int width = bit.getWidth();
    	int height = bit.getHeight();
    	int[] pixNew = new int[width * height];
    	int[] pixOld = new int[width * height];
    	bit.getPixels(pixNew, 0, width, 0, 0, width, height);
    	bit.getPixels(pixOld, 0, width, 0, 0, width, height);
    	
    	// Apply pixel-by-pixel change
    	int filterHalfWidth = filterWidth/2;
    	int filterHalfHeight = filterHeight/2;
    	int filterArea = filterWidth * filterHeight;
    	for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
    	{
    		for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
    		{
    			// Accumulate values in neighborhood
    			int accumR 0, accumG 0, accumB = 0;
    			for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
    			{
    				for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
    				{
    					int index = (y+dy)*width + (x+dx);
    					accumR += (pixOld[index] >> 16) & 0xff;
    					accumG += (pixOld[index] >> 8) & 0xff;
    					accumB += pixOld[index] & 0xff;
    				} // dx
    			} // dy
    			
    			// Normalize
    			accumR /= filterArea;
    			accumG /= filterArea;
    			accumB /= filterArea;
    			int index = y*width + x;
    			pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
    		} // x
    	} // y
    	
    	// Change bitmap to use new array
    	Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    	bitmap.setPixels(pixNew, 0, width, 0, 0, width, height);
    	bit = null;
    	bit = bitmap;
    	pixOld = null;
    	pixNew = null;
    }
}
0
Utilisateur anonyme
16 avril 2013 à 22:40
Vous voyez bien que ce code fait 3 sommes de 'filterArea' éléments et les divise à la fin par 'filterArea', cela devrait vous faire penser à des moyennes arithmétiques.



















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Rejoignez-nous