Как я могу преобразовать объект BufferedImage в InputStream или BLOB? - PullRequest
9 голосов
/ 04 октября 2011

Я пытаюсь сохранить загруженное пользователем изображение в базу данных с атрибутом LONGBLOB ... Я столкнулся с проблемой с PreparedStatement, у которого есть два метода для установки большого двоичного объекта:

public void setBinaryStream(int parameterIndex, InputStream x)

public void setBlob(int parameterIndex, Blob x)

public void setBlob(int parameterIndex, InputStream inputStream)

Теперь проблема в том, что у меня есть BufferedImage объект, который должен быть преобразован в Blob илиInputStream для загрузки ...

Как я могу это сделать, не потеряв оригинальный формат изображения или качество?

Ответы [ 4 ]

28 голосов
/ 04 октября 2011

Как это сделать без потери исходного формата или качества изображения?

Вам необходимо сохранить его, используя подходящий формат (без потерь). Формат png является одним из вариантов.

В классе ImageIO есть методы для записи изображения в выходной поток.

Вот полный пример того, как вы получаете InputStream, из которого вы можете прочитать PNG-представление содержимого BufferedImage:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
InputStream is = new ByteArrayInputStream(baos.toByteArray());
3 голосов
/ 04 октября 2011

Вот пример кода:

ByteArrayOutputStream bas = new ByteArrayOutputStream();
ImageIO.write(image,"jpg", bas);
byte[] bytes = bas.toByteArray();
InputStream is = new ByteArrayInputStream(bytes);

Не забудьте проверить второй параметр ImageIO.write в требуемом формате изображения (например, «jpg», «bmp», «png»).

1 голос
/ 04 октября 2011

Написать функции для сериализации / десериализации BufferedImage в / из byte [] и использовать классы ByteArrayInputStream и ByteArrayOutputStream.

Возможно, вам нужно сериализовать тип изображения, ширину, высоту и значения пикселей изображения (полученные с BufferedImage.getRGB(x, y)).

Альтернатива - позвонить ImageIO.write(image, "png", outStream) преобразовать изображение в формат PNG и записать его в ByteArrayOutputStream. Есть эквивалент ImageIO.read(inputStream) способ чтения изображения из ByteArrayInputStream. При конвертации в / из PNG возникают некоторые накладные расходы. Но PNG - это сжатый формат изображения, и вы сэкономите много пространства по сравнению с хранением изображений без сжатия.

0 голосов
/ 26 декабря 2016

Для создания BLOB-объекта:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
Blob blFile = new javax.sql.rowset.serial.SerialBlob(baos.toByteArray());
...