web-dev-qa-db-fra.com

Obtenez RVB d'une image tamponnée

Quelqu'un peut-il expliquer comment obtenir un tableau de valeurs RVB à partir d'une BufferedImage?

J'ai une image d'échelle de gris dans une BufferedImage et j'ai besoin d'extraire un tableau de 0 à 255 valeurs qui décrivent l'image.
Je sais que BufferedImage est correct car je peux l'enregistrer en PNG. Cependant, si j'utilise int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData(); j'obtiens un tas d'énormes nombres négatifs.

J'ai cherché pendant un certain temps et j'ai vu des références au décalage de certaines valeurs ( post ) mais je ne comprends pas vraiment ce qu'elles disent.

Fondamentalement, je veux passer d'une BufferedImage à un tableau de 0 à 255 valeurs RBG.
Je ne suis pas sûr de m'être bien expliqué, plaese demande plus de détails est nécessaire.

Éditer:
@ Garbage Merci pour l'astuce. J'ai essayé int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth (), heightMap.getHeight (), null, 0, heightMap.getWidth ()); Mais obtenez le même résultat.
@ Greg Kopff Le résultat est 2 et il a été défini sur TYPE_INT_ARGB

18
kotoko

Vous obtenez des nombres négatifs car la valeur int que vous obtenez d'un des pixels est composée de rouge, vert, bleu et alpha. Vous devez diviser les couleurs pour obtenir une valeur pour chaque composant de couleur.

La façon la plus simple de le faire est de créer un objet Color et d'utiliser getRed , getGreen et getBlue (ainsi que les méthodes getAlpha ) pour obtenir les composants:

public static void main(String... args) throws Exception {

    BufferedImage image = ImageIO.read(
         new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

    int w = image.getWidth();
    int h = image.getHeight();

    int[] dataBuffInt = image.getRGB(0, 0, w, h, null, 0, w); 

    Color c = new Color(dataBuffInt[100]);

    System.out.println(c.getRed());   // = (dataBuffInt[100] >> 16) & 0xFF
    System.out.println(c.getGreen()); // = (dataBuffInt[100] >> 8)  & 0xFF
    System.out.println(c.getBlue());  // = (dataBuffInt[100] >> 0)  & 0xFF
    System.out.println(c.getAlpha()); // = (dataBuffInt[100] >> 24) & 0xFF
}

Les sorties:

173
73
82
255
27
dacwe