Question

Je suis en train d'écrire 16 bits en niveaux de gris imageData à un .png en utilisant BufferedImage.TYPE_USHORT_GRAY. Normalement, je écrire à une image comme ceci:

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"));

pour écrire à une image .png.

Mais maintenant, j'ai cela comme l'image:

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

Comment puis-je de sauver des pixels à ce format? L'utilisation setRGB () avec un nombre entier de 16 bits ne semble pas fonctionner, quand j'ouvre le fichier .png sauvé, je vois beaucoup de bandes qui se passe.

J'ai essayé l'enregistrement d'un simple dégradé de 0 à 65535, puis en utilisant la setRGB () sur l'image en niveaux de gris, et vérifié les résultats dans Photoshop. Je peux voir l'image se compose de petits gradients tous les 256 lignes. Je devine que ce soit setRGB () ou ImageIO ne fonctionne pas comme je le voudrais à.

Y at-il des solutions pour cela? Est-ce que ImageIO supporte même le format BufferedImage.TYPE_USHORT_GRAY? Ou peut enregistrer seulement 8 bits de données? Et si elle peut sauver 16bit données, comment pourrais-je aller sur l'enregistrement des données de pixels, de préférence d'une manière comme setRGB () fonctionne (donc pour une certaine coordonnées x, y)?

Était-ce utile?

La solution

Pst déjà commenté ci-dessous ma question:

  

Essayez d'utiliser le raster directement?

Accès à l'Raster a résolu le problème directement.

Autres conseils

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ée). Cette image a une ComponentColorModel avec un CS_GRAY ColorSpace.

Alors essayez instanciation votre propre ColorSpace avec le type de 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 ...

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

int ushort = (int)(shortData[x][y]) & 0xFFFF;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top