2010-11-07 34 views
3

J'essaye d'écrire 16 bit en niveaux de gris imagedata à un png en utilisant BufferedImage.TYPE_USHORT_GRAY. Normalement, j'écris une image comme ceci:Ecrit en 16 bits BufferedImage TYPE_USHORT_GRAY

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 

alors:

image.setRGB(x,y,Color.getRGB); 

pour définir les pixels, et enfin:

ImageIO.write(image, "png", new File(path + ".png")); 

à écrire à une image .png.

Mais maintenant, j'ai ce que l'image:

BufferedImage imageGray = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY); 

Comment puis-je aller sur l'enregistrement de pixels à ce format? L'utilisation de setRGB() avec un entier de 16 bits ne semble pas fonctionner, quand j'ouvre le fichier png enregistré, je vois beaucoup de baguage se produire.

J'ai essayé d'enregistrer un dégradé simple de 0 à 65535 puis d'utiliser setRGB() sur l'image en niveaux de gris et j'ai vérifié les résultats dans Photoshop. Je peux voir l'image se compose de plus petits gradients tous les 256 rangs. Je suppose que setRGB() ou imageIO ne fonctionne pas comme je le voudrais.

Y a-t-il des solutions de contournement pour cela? Est-ce que imageIO prend même en charge le format BufferedImage.TYPE_USHORT_GRAY? Ou peut-il seulement enregistrer des données de 8 bits? Et si cela peut sauver des données 16bit, comment est-ce que je pourrais sauver des données de pixel, de préférence d'une manière comme setRGB() fonctionne (donc pour une certaine coordonnée x, y)?

+4

Essayez d'utiliser le Raster directement? –

+0

Hm, pourquoi je ne pense pas à ça ... semble bien fonctionner, merci! (pourriez-vous republier comme réponse pour que je puisse l'accepter?) – FinalArt2005

Répondre

1

Comme pst déjà formulé des observations ci-dessous mon question tout ce que je devais faire était d'accéder directement au Raster. Problème résolu!

0

De BufferedImage vous pouvez lire

public static final int TYPE_USHORT_GRAY

représente une image en niveaux de gris court non signé, non indexé). Cette image possède un ComponentColorModel avec un espace colorimétrique CS_GRAY.

essayer donc instancier votre propre ColorSpace avec le type CS_GRAY (ColorSpace.getInstance(ColorSpace.CS_GRAY) devrait le faire, je suppose). Cet objet a une méthode appelée fromRGB que vous devriez être en mesure d'utiliser ...

+1

Est-ce que cela ne convertit pas seulement les données sRGB en données en niveaux de gris? J'ai déjà des données en niveaux de gris, j'ai juste besoin de les enregistrer pixel par pixel dans un BufferedImage avec TYPE_USHORT_GRAY afin de pouvoir sauvegarder les données 16 bits. Pour le moment, j'aime l'idée de setRGB() puisque vous pouvez spécifier la coordonnée que vous voulez sauvegarder, mais il n'y a pas d'équivalent saveGray(). Je peux juste définir des entiers 16 bits en utilisant setRGB(), mais il s'avère que le modèle de couleur ne l'interprète pas correctement. Existe-t-il un moyen de convertir un nombre entier de 16 bits en valeur pouvant être utilisée avec setRGB qui fonctionne avec l'espace de couleurs CS_GRAY? – FinalArt2005

0

Vous avez probablement besoin d'élargir le short 16bit signé à ints et enlever le signe:

int ushort = (int)(shortData[x][y]) & 0xFFFF; 
+0

J'ai déjà des entiers de 16 bits non signés, j'utilise juste le BufferedImage.TYPE_USHORT_GRAY comme un moyen pratique d'enregistrer des choses en 16 bits en niveaux de gris png – FinalArt2005