IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

problème de compréhension bits couleurs


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut problème de compréhension bits couleurs
    Bonjour j'ai un code qui permet de coller les pièces d'un puzzle, mais je ne comprends pas tres bien cette partie de code, est-ce qu'il permet de faire un test sur la même pièce ou bien sur les deux pièces voisines, pour information le tableau data[] contient les bits d'une seul pièce de l'image finale.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int[] data = new int[width*height];
        PixelGrabber grabber = 
          new PixelGrabber (image, box.x, box.y,
            width, height, data, 0, width);
        grabber.grabPixels();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
      	static void bevel (int[] data, int width, int height)
      	{
      		// Scan diagonal NW-SE lines.  The first and last lines can be skipped.
      		for (int i = 0; i < width+height-3; i++) 
      		{
      			int x = Math.max (0, i-height+2);
      			int y = Math.max (0, height-i-2);
      			boolean nw, c, se; // true iff that pixel is opaque
      			nw = c = se = false;
      			c = (((data[y*width+x] >> 24) & 0xff) > 0);
      			while ((x < width) && (y < height)) {
      				if ((x+1 < width) && (y+1 < height))
      				{
      					se = (((data[(y+1)*width+(x+1)] >> 24) & 0xff) > 0);
      				}
      				else 
      				{	
      					se = false;
      				} 
     
      				if (c) 
      				{
      					int datum = data[y*width+x];
      					if ( nw && !se) 
      					{
      						data[y*width+x] =   darker (datum);
      					}
      					if (!nw &&  se) 
      					{
      						data[y*width+x] = brighter (datum);
      					}
      				}
      				nw = c;
      				c = se;
      				x++; y++;
      			}
      		}
      	}
     
            static final int fn = 10;
      	static final int fd =  7;
      	static final int maxB =  255 * fd / fn;
      	static final int brighter (int val) {
      		int r = (val >> 16) & 0xff;
      		int g = (val >>  8) & 0xff;
      		int b = (val      ) & 0xff;
      		//  #030303 gris
      		if ((r==0) && (g==0) && (b==0)) return 0xff030303;
      		r = (r < 3) ? 3 : r;
      		g = (g < 3) ? 3 : g;
      		b = (b < 3) ? 3 : b;
      		r = (r >= maxB) ? 255 : (r * fn / fd);
      		g = (g >= maxB) ? 255 : (g * fn / fd);
      		b = (b >= maxB) ? 255 : (b * fn / fd);
      		return ((((0xff00 | r) << 8) | g) << 8) | b;
      	}
     
      	static final int darker (int val) {
      		int r = (val >> 16) & 0xff;
      		int g = (val >>  8) & 0xff;
      		int b = (val      ) & 0xff;
      		r = r * fd / fn;
      		g = g * fd / fn;
      		b = b * fd / fn;
      		return ((((0xff00 | r) << 8) | g) << 8) | b;
      	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bevel(curData, curWidth, curHeight);
      		image = Toolkit.getDefaultToolkit().createImage (
      			new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth));


    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Il semble qu'il regarde si le pixel est transparent ou translucide. Egalement brighter() et darker() modifient la couleur pure de maniere idoine en changeant les composantes rouge, verte et bleue.

    En Java, les couleurs sont codees en RGB ou plus precisement en sRGB ou ARGB, une norme de codage de couleur sur 32bits qui stocke les infos sur 4 octets :

    • a (bits 31 a 24) : la transparence.
    • r (bits 23 a 16) : la composante rouge.
    • g (bits 15 a 8) : la composante verte.
    • b (bits 7 a 0) : la composante bleue.


    Ainsi il est possible de decomposer la representation entiere de la couleur avec les operation & et >> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int a = (rgb >> 24) & 0xFF;
    int r = (rgb >> 16) & 0xFF;
    int g = (rgb >> 8) & 0xFF;
    int b = (rgb >> 0) & 0xFF;
    Et il est possible de recomposer la representation entiere de la couleur avec les operations &, | et <<

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int argb = ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF) << 0)
    Maintenant si tu ne sais pas ce que font les operateurs &, |, >> et << je te conseille d'aller lire les didacticiels sur les operateurs bit a bit (bitwise).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2005, 18h08
  2. Réponses: 5
    Dernier message: 11/04/2005, 10h21
  3. [C#] Problème de compréhension de System.Convert ET Provider
    Par papouAlain dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/11/2004, 21h52
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo