2017-02-11 2 views
0

J'ai une échelle de gris height map, que j'ai créée dans Photoshop, et je dois la passer à un programme Java pour traitement. Je le charger en utilisant le ImageIO.read (...) la méthode puis convertir en niveaux de gris avec ce code:
Valeurs de niveaux de gris incorrectes à partir de Java BufferedImage Raster

BufferedImage map = ImageIO.read(new File(...)); 
BufferedImage heightMap = new BufferedImage(map.getWidth(), map.getHeight(), BufferedImage.TYPE_BYTE_GRAY); 
heightMap.getGraphics().drawImage(map, 0, 0, null); 
heightMap.getGraphics().dispose(); 

Dans Photoshop, pixel (0,0) a une valeur de 17 . lorsque j'utilise heightMap.getData().getSample(0, 0, 0) ou ((byte[])(heightMap.getRaster().getDataElements(0, 0, null)))[0] & 0xff, je reçois une valeur de 64.

Fait intéressant, quand je lance map.getRGB(0, 0)>>16&0xFF, je reçois aussi la valeur de 64.

Comment puis-je résoudre ce problème et obtenir une valeur de 17?

Merci.

+0

Pourquoi convertissez-vous une image en niveaux de gris en une image en niveaux de gris? Que disent getType et getColorModel sur la carte d'origine? – john16384

+0

Parce que quand je charge l'image (PNG), il est chargé comme type 0 (TYPE_CUSTOM) et avec ColorModel: #pixelBits = 32 numComponents = 2 espace de couleur = [email protected] transparency = 3 a alpha = true isAlphaPre = faux. –

Répondre

0

La cause de ce problème était le format de fichier (PNG). Dans Photoshop, j'ai eu le mode de toile en niveaux de gris et 8 bits/canal. Après l'achèvement, je sauvais la carte image/hauteur comme un PNG qui a obligé Java à charger l'image comme type ou TYPE_CUSTOM et causé la conversion des niveaux de gris à gâcher, probablement en raison de la transparence.

Enregistrement de l'image au format JPEG fait Java charger l'image directement dans échelle de gris (TYPE_BYTE_GRAY) et les deux map.getData().getSample(0, 0, 0) et ((byte[])(map.getRaster().getDataElements(0, 0, null)))[0] & 0xff a retourné une valeur de 13. Pas la valeur parfaite, mais bien mieux que le 64.

PS : Comme prévu, cette fois, map.getRGB(0, 0)>>16&0xFF a renvoyé la valeur incorrecte de 64.