2012-05-23 20 views
10

Tengo un BufferedImage i y me gustaría conseguir el Color de un píxel determinado de ese imageincluyendo el valor alfa. El píxel se identifica utilizando las coordenadas x y y.bufferedImage.getRGB (x, y) no produce alfa

Esto es lo que he intentado:

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

Por alguna razón, el nuevo objeto de color RGB contiene la correcta, pero el alfa se pierde.

¿Qué estoy haciendo mal?

Gracias de antemano

+1

No estoy exactamente seguro de cómo funciona esta clase, pero estás usando una función llamada 'getRGB' y luego te sorprende que solo obtenga RGB? – murgatroid99

+0

Sí, eso es cierto, pero he comprobado anteriormente si el píxel contiene algún valor alfa con el método getRGB(). http://stackoverflow.com/questions/10419838/how-can-i-find-out-where-a-bufferedimage-has-alpha-in-java – Rapti

+0

Ya veo. ¿A qué te refieres con "el alfa se pierde"? – murgatroid99

Respuesta

17

El único parámetro Color constructor que está utilizando la información descartes alfa. Utilice la versión de dos parámetros en lugar y pasar en true para hasalpha:

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

La relevante Javadoc:

Color(int rgb)

Crea un color sRGB opaco con el valor RGB combinado especificado que consta de la componente rojo en los bits 16-23, el componente verde en los bits 8-15, y el componente azul en los bits 0-7.

Color(int rgba, boolean hasalpha)

Crea un color sRGB con el valor RGBA combinado especificado que consiste en el componente alfa en los bits 24-31, el componente rojo en bits 16-23, el componente verde en bits 8-15, y las componente azul en los bits 0-7.

+0

¡Funciona perfectamente, gracias! – Rapti

+0

¡buena explicación! –

5

El Alpha no está perdido.

Debe usar el constructor (int, boolean) que toma la información de los píxeles y especifica si tiene valores alfa con el booleano o el constructor que toma 4 valores, Rojo, Verde, Azul y Alfa.

la (int, int, int, int) la información del constructor de la JavaDoc

para acortar código, siempre se puede reemplazar todo el siguiente código con Color color = new Color(i.getRGB(x, y), true); que cuenta el constructor color que hace la información de píxeles contener valor alfa

la (int, boolean) la información del constructor JavaDoc

Tenga en cuenta que a veces, cuando la recuperación de la alfa de la siguiente manera podría devolver -1, en cuyo caso esto significa que vuelve de nuevo a 255, por lo que debe realizar 256- 1 para obtener el valor alfa real. Este fragmento muestra cómo cargar una imagen y obtener el color de esa imagen en ciertas coordenadas, en este caso, 0,0. El siguiente ejemplo puede mostrarle cómo recuperar cada valor de color, incluido alfa, y reconstruirlo en un nuevo Color.

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 como se puede ver como se 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.

que significa que el valor Alfa también se recupera.

Cuestiones relacionadas