2012-05-23 14 views
10

Ho un BufferedImage i e mi piacerebbe ottenere il Color da un certo pixel di che imagecompreso il valore alfa. Il pixel viene identificato utilizzando le coordinate x e .bufferedImage.getRGB (x, y) non produce alfa

Ecco cosa ho provato:

Color c = new Color(i.getRGB(x, y)); 

Per qualche ragione, il nuovo oggetto di colore RGB contiene la corretta ma l'alfa si perde.

Cosa sto sbagliando?

Grazie in anticipo

+1

Non sono esattamente sicuro di come funzioni questa classe, ma si sta utilizzando una funzione chiamata 'getRGB' e quindi si è sorpresi che ottenga solo RGB? – murgatroid99

+0

Sì, è vero, ma ho controllato in precedenza se il pixel contiene un valore alfa usando il metodo getRGB(). http://stackoverflow.com/questions/10419838/how-can-i-find-out-where-a-bufferedimage-has-alpha-in-java – Rapti

+0

Capisco. Cosa intendi esattamente per "l'alfa si perde"? – murgatroid99

risposta

17

Il singolo parametro Color costruttore si sta utilizzando informazioni di scarti alpha. Utilizzare la versione a due parametri invece e passare true per hasalpha:

Color c = new Color(i.getRGB(x, y), true); 

La pertinente Javadoc:

Color(int rgb)

Crea un colore sRGB opaco con il valore RGB combinato specificato costituito dalla componente rosso nei bit 16-23, il componente verde nei bit 8-15 e il componente blu nei bit 0-7.

Color(int rgba, boolean hasalpha)

Crea un colore sRGB con il valore RGBA combinato specificato costituito dal componente alfa in bit 24-31, la componente rossa in bit 16-23, il componente verde in bit 8-15, e le componente blu in bit 0-7.

+0

Funziona perfettamente, grazie! – Rapti

+0

buona spiegazione! –

5

L'Alpha non è perso.

È necessario utilizzare il costruttore (int, booleano) che prende le informazioni sui pixel e specifica se ha valori alfa con il booleano o il costruttore che accetta 4 valori, Rosso, Verde, Blu e Alfa.

il (int, int, int, int) informazioni costruttore dal JavaDoc

Per accorciare il codice, è sempre possibile sostituire tutti il ​​seguente codice con Color color = new Color(i.getRGB(x, y), true); che racconta il costruttore di colore che le informazioni dei pixel fa contenere il valore alfa

il (int, boolean) informazioni costruttore dal JavaDoc

noti che a volte durante il recupero alfa seguente modo potrebbe restituire -1, nel qual caso questo significa che torna indietro al 255, quindi è necessario eseguire 256- 1 per ottenere il valore alfa effettivo. questo frammento mostra come caricare un'immagine e ottenere il colore di quell'immagine su determinate coordinate, in questo caso 0,0. L'esempio seguente può mostrare come recuperare ciascun valore di colore compreso l'alfa e ricostruirlo con un nuovo colore.

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 

public class main { 

    public static void main(String [] args){ 
     BufferedImage image = null; 
     try { 
      image = ImageIO.read(new URL("image.png")); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     int pixel = image.getRGB(0, 0); 

     int alpha = (pixel >> 24) & 0xff; 
     int red = (pixel >> 16) & 0xff; 
     int green = (pixel >> 8) & 0xff; 
     int blue = (pixel >> 0) & 0xff; 

     Color color1 = new Color(red, green, blue, alpha); 

     //Or use 
     Color color2 = new Color(image .getRGB(0, 0), true); 

    } 
    } 

BufferedImages getRGB (int, int) JavaDoc come si può vedere come si dice:

Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method.

che significa che il valore di Alpha è anche recuperato.

Problemi correlati