Написание javafx.сцены.изображения.Изображение в файл?

#javafx

Вопрос:

Как бы я написал javafx.scene.image.Изображение изображение в файл. Я знаю, что вы можете использовать ImageIO для буферизованных изображений, но есть ли способ сделать это с изображением javafx?

Ответ №1:

Просто преобразуйте его в BufferedImage первый, используя javafx.embed.swing.SwingFXUtils :

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

Ответ №2:

Почти 3 года спустя, и теперь у меня есть знания, чтобы сделать это и ответить на этот вопрос. Да, первоначальный ответ также был верен, но он включал в себя сначала преобразование изображения в буферизованное изображение, и в идеале я хотел полностью избежать качания. В то время как это выводит необработанную версию изображения RGBA, которая достаточно хороша для того, что мне нужно было сделать. На самом деле я мог бы просто использовать raw BGRA, так как я писал программное обеспечение, чтобы открыть результат, но так как gimp не может его открыть, я решил преобразовать его в 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();
}
 

Комментарии:

1. @Cypher Каждое значение цвета равно 0-255(1 байт), и у вас их 4 на пиксель: синий, зеленый, красный и альфа(прозрачный).

2. Справедливо ли это для каждого формата изображения? что делать, если изображение не имеет прозрачности, такой как jpg?

3. @JFValdes Я не пробовал это с JPEG, однако я предполагаю, что, поскольку формат пикселей получен с использованием PixelFormat.getByteBgraInstance() , он всегда будет иметь альфа-канал. Я предполагаю, что в случае JPEG все альфа-значения будут равны 0xFF. Я могу проверить это, когда у меня будет время, и перезвонить вам, если вы еще этого не сделали.

4. @JFValdes да, это отлично работает с jpeg. Как я и подозревал, все альфа — значения заканчиваются как 0xFF.

5. Осторожно, я не верю, что этот подход будет работать с анимированными GIF-файлами, как я думаю getPixelReader() null , в этом случае.