2014-11-21 16 views

risposta

2

quasi 3 anni più tardi e ora ho le conoscenze per farlo e rispondi a questa. Sì, la risposta originale era valida, ma prima era necessario convertire l'immagine in BufferedImage e io volevo idealmente evitare lo swing completamente. Mentre questo fa uscire la versione RGBA raw dell'immagine è abbastanza buona per quello che dovevo fare. In realtà, potrei semplicemente usare BGRA raw da quando stavo scrivendo il software per aprire il risultato, ma dato che gimp non può aprirlo, credo che lo convertirò in RGBA.

Image img = new Image("file:test.png"); 
int width = (int) img.getWidth(); 
int height = (int) img.getHeight(); 
PixelReader reader = img.getPixelReader(); 
byte[] buffer = new byte[width * height * 4]; 
WritablePixelFormat<ByteBuffer> format = PixelFormat.getByteBgraInstance(); 
reader.getPixels(0, 0, width, height, format, buffer, 0, width * 4); 
try { 
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("test.data")); 
    for(int count = 0; count < buffer.length; count += 4) { 
     out.write(buffer[count + 2]); 
     out.write(buffer[count + 1]); 
     out.write(buffer[count]); 
     out.write(buffer[count + 3]); 
    } 
    out.flush(); 
    out.close(); 
} catch(IOException e) { 
    e.printStackTrace(); 
} 
+0

Cosa rappresenta il numero magico '4'? – Cypher

+0

@Cypher Ogni valore di colore è 0-255 (1 byte) e ne hai 4 per pixel: blu, verde, rosso e alfa (trasparente) – Scoopta

16

Basta convertirlo in un BufferedImage prima, utilizzando javafx.embed.swing.SwingFXUtils:

Image image = ... ; // javafx.scene.image.Image 
String format = ... ; 
File file = ... ; 
ImageIO.write(SwingFXUtils.fromFXImage(image, null), format, file); 
Problemi correlati