Signification de (& 0xff) [Résolu]

- - Dernière réponse :  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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
1
Merci
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)

Merci Utilisateur anonyme 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
0
Merci
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;
    }
}
Commenter la réponse de hta9wa
0
Merci
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)
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.