2010-04-11 17 views

risposta

69

Color classe di Java può fare la conversione:

Color c = new Color(image.getRGB()); 
int red = c.getRed(); 
int green = c.getGreen(); 
int blue = c.getBlue(); 
+0

La creazione di una nuova istanza 'Color' di ogni pixel di un'immagine genera un sacco di immondizia e può essere * molto * inefficiente. Se si pianifica di elaborare ogni pixel di un'immagine, è molto più efficiente ottenere il colore RGB di ogni pixel con 'bufferedImage.getRGB (x, y)' ed estrarre i componenti rosso, verde e blu come descritto nella risposta di João Silva. – Marco13

7

avrete bisogno di un po 'di aritmetica binaria di base per dividerlo:

int blue = rgb & 0xFF; 
int green = (rgb >> 8) & 0xFF; 
int red = (rgb >> 16) & 0xFF; 

(O forse il contrario, posso onestamente Ricordo che la documentazione non mi dà una risposta immediata)

+0

Credo che tu abbia ragione. – HyperNeutrino

105

Un pixel è rappresentato da un numero intero a 4 byte (32 bit), ad esempio:

00000000 00000000 00000000 11111111 
^ Alpha ^Red  ^Green ^Blue 

Quindi, per ottenere i singoli componenti di colore, basta un po 'di aritmetica binaria:

int rgb = getRGB(...); 
int red = (rgb >> 16) & 0x000000FF; 
int green = (rgb >>8) & 0x000000FF; 
int blue = (rgb) & 0x000000FF; 

Questo è davvero quello che i metodi della classe java.awt.Color fanno:

553  /** 
    554  * Returns the red component in the range 0-255 in the default sRGB 
    555  * space. 
    556  * @return the red component. 
    557  * @see #getRGB 
    558  */ 
    559  public int getRed() { 
    560   return (getRGB() >> 16) & 0xFF; 
    561  } 
    562 
    563  /** 
    564  * Returns the green component in the range 0-255 in the default sRGB 
    565  * space. 
    566  * @return the green component. 
    567  * @see #getRGB 
    568  */ 
    569  public int getGreen() { 
    570   return (getRGB() >> 8) & 0xFF; 
    571  } 
    572 
    573  /** 
    574  * Returns the blue component in the range 0-255 in the default sRGB 
    575  * space. 
    576  * @return the blue component. 
    577  * @see #getRGB 
    578  */ 
    579  public int getBlue() { 
    580   return (getRGB() >> 0) & 0xFF; 
    581  } 
6

Per semplice manipolazioni di colore, è possibile utilizzare

bufImg.getRaster().getPixel(x,y,outputChannels) 

OutputChannels è una matrice per la memorizzazione del pixel recuperato. La sua lunghezza dipende dal numero di canali effettivi dell'immagine. Ad esempio, un'immagine RGB ha 3 canali; e un'immagine RGBA ha 4 canali.

Questo metodo ha 3 tipi di output: int, float e double. Per ottenere un valore di colore compreso tra 0 e 255, il proprio parametro outputChannels dovrebbe essere un array int [].

Problemi correlati