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)?

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top