Scrivici 16 bit BufferedImage TYPE_USHORT_GRAY
-
29-09-2019 - |
Domanda
Sto cercando di scrivere 16 bit in scala di grigi imagedata ad un PNG utilizzando BufferedImage.TYPE_USHORT_GRAY. Normalmente scrivo a un'immagine in questo modo:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
quindi:
image.setRGB(x,y,Color.getRGB);
per impostare i pixel, e infine:
ImageIO.write(image, "png", new File(path + ".png"));
per scrivere ad un'immagine png.
Ma ora ho questo come immagine:
BufferedImage imageGray = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY);
Come posso fare per salvare pixel per quel formato? Utilizzando setRGB () con un numero intero a 16 bit non sembra al lavoro, quando ho aperto il file PNG salvato Vedo un sacco di bande accadendo.
Ho provato salva un semplice gradiente da 0 a 65535 e quindi utilizzando l'setRGB () scala di grigio, e controllato i risultati in Photoshop. Posso vedere l'immagine è costituita da piccoli gradienti ogni 256 righe. Sto indovinando sia setRGB () o ImageIO non funziona come vorrei a.
Ci sono soluzioni per questo? Ha ImageIO anche supporta il formato BufferedImage.TYPE_USHORT_GRAY? Oppure può salvare solo 8 bit di dati? E se è possibile salvare i dati a 16 bit, come potrei fare per il salvataggio dei dati di pixel, preferibilmente in un modo come setRGB () funziona (in modo per un certo coordinate x, y)?
Soluzione
PST già commentato di seguito la mia domanda:
Provare a utilizzare direttamente la Raster?
Accesso al raster risolto direttamente il problema.
Altri suggerimenti
Da BufferedImage
si può leggere
int finale public static TYPE_USHORT_GRAY
Rappresenta un'immagine in scala di grigi breve senza segno, non indicizzata). Questa immagine ha una ComponentColorModel con un CS_GRAY ColorSpace.
Quindi, cercare un'istanza proprio ColorSpace
con il tipo CS_GRAY
(ColorSpace.getInstance(ColorSpace.CS_GRAY)
dovrebbe farlo suppongo). Questo oggetto ha un metodo chiamato fromRGB
che si dovrebbe essere in grado di utilizzare ...
È probabilmente bisogno di ampliare i pantaloncini firmati 16bit per int e rimuovere il segno:
int ushort = (int)(shortData[x][y]) & 0xFFFF;