Как получить байт [] из javafx imageView?

Как получить байт [] из класса javafx image/imageview? Я хочу сохранить свое изображение как Blob в мою базу данных. Это метод, который я использую для него.

 public PreparedStatement prepareQuery(HSQLDBConnector connector) {
        try {
            Blob logoBlob = connector.connection.createBlob();
            logoBlob.setBytes(0,logo.getImage());//stuck  here
            for (int i = 0, a = 1; i < data.length; i++, a++) {

                connector.prepStatCreateProfile.setString(a, data[i]);

            }
            //store LOB

            connector.prepStatCreateProfile.setBlob(11, logoBlob);

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return connector.prepStatCreateProfile;
    }

Есть ли способ конвертировать из моего текущего объекта (изображения), изображения) в байт []?, или shoud, я начинаю думать об использовании другого класса для своего изображения/в качестве альтернативы указывать на местоположение со ссылкой и работать с путями/URL-адресами?

Ответ 1

попробуйте следующее:

BufferedImage bImage = SwingFXUtils.fromFXImage(logo.getImage(), null);
ByteArrayOutputStream s = new ByteArrayOutputStream();
ImageIO.write(bImage, "png", s);
byte[] res  = s.toByteArray();
s.close(); //especially if you are using a different output stream.

должен работать в зависимости от класса логотипа

вам нужно указать формат во время записи и чтения, и, насколько я помню, bmp не поддерживается, поэтому вы получите массив png-байтов в базе данных

Ответ 2

чисто java fx solution trace (== вам нужно будет заполнить недостающие точки:)

Image i = logo.getImage();
PixelReader pr = i.getPixelReader();
PixelFormat f = pr.getPixelFormat();

WriteablePixelFromat wf = f.getIntArgbInstance(); //???

int[] buffer = new int[size as desumed from the format f, should be  i.width*i.height*4];

pr.getPixels(int 0, int 0, int i.width, i.height, wf, buffer, 0, 0);

Ответ 3

Ответ Лоренцо верен, этот ответ просто рассматривает аспекты эффективности и переносимости.

В зависимости от типа изображения и требований к хранению может быть эффективным преобразование изображения в сжатый формат для хранения, например:

ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
ImageIO.write(SwingFXUtils.fromFXImage(fxImage, null), "png", byteOutput);
Blob logoBlob = connector.connection.createBlob();
logoBlob.setBytes(0, byteOutput.toByteArray());

Еще одно преимущество перехода на общий формат, например png, перед тем как сохранить изображение, заключается в том, что другие программы, которые имеют дело с базой данных, смогут читать изображение, не пытаясь его преобразовать из определенного формата хранения массива в формате JavaFX.