#java #arrays
#java #массивы
Вопрос:
Я пытаюсь преобразовать массив байтов в a bufferedImage
для отображения в a jLabel
, но ImageIO.read()
свойство возвращает нулевое значение и, следовательно, a NullPonterException
. Что мне делать?
InputStream input = new ByteArrayInputStream(array);
try {
BufferedImage bufer = ImageIO.read(input);
ImageIcon icon=new ImageIcon(new ImageIcon(bufer).getImage().getScaledInstance(jLabel3.getWidth(), jLabel3.getHeight(), Image.SCALE_SMOOTH));
jLabel3.setIcon(icon);
} catch (IOException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
}`
Комментарии:
1. Как вы инициализировали
input
? Существует ли файл на самом деле?2. @KenY-N это должно ответить на ваш первый вопрос: InputStream input = new ByteArrayInputStream(array); более вероятно, что массив не содержит значения, которое, по мнению Люциана, должно
Ответ №1:
Согласно javadoc, read(InputStream)
метод …
«Возвращает a
BufferedImage
как результат декодирования a, предоставленногоInputStream
сImageReader
автоматически выбранным из числа зарегистрированных в данный момент. ОноInputStream
завернуто вImageInputStream
. Если ни один зарегистрированныйImageReader
не утверждает, что может прочитать результирующий поток,null
возвращается. «
Скорее всего, последнее предложение объясняет вашу проблему.
Что мне делать?
Итак, ваш подход к решению этой проблемы был бы:
- Убедитесь, что содержимое
array
соответствует вашим ожиданиям. - Определите, какой это формат изображения, и что он правильно представлен. Например, если изображение было сохранено в базе данных или отправлено в сетевом запросе, убедитесь, что оно не было искажено в процессе.
- Убедитесь, что это поддерживаемый формат изображения; т. Е. Тот, Для которого должен быть зарегистрированный
ImageReader
класс.
Комментарии:
1. Я получаю массив из базы данных postgresql. Вначале я сохраняю массив в БД как тип данных bytea, и когда я выполняю консультацию и помещаю эти значения в массив byte[] и выполняю ImageIO.read(Imputstream), возвращает нулевое значение. Изображение является jpg поддерживаемым изображением. Я думаю, что проблема в том, когда я получаю значения из базы данных. Есть идеи?
2. Я вижу, вы решили эту проблему… и проблема заключалась в том, как вы сохраняли / загружали массив изображений.
Ответ №2:
Спасибо, что помогли мне решить проблему, я собираюсь опубликовать ответ здесь, чтобы помочь другим.
1. Запросы к базе данных (postgresql) должны быть PreparedStatement, потому что, если вы сохраняете изображение, преобразованное в byte [], это объявление предоставляет вам функциональность setBinaryStream, и когда вы извлекаете его и добавляете в byte[], ничего не меняется
////This way save the image and his path (the last is optional)
JFileChooser f = new JFileChooser();
f.showOpenDialog(null);
File file = f.getSelectedFile();
FileInputStream s = null;
String path = file.getAbsolutePath();
try {
s = new FileInputStream(file);
Conexion();
PreparedStatement pq = conexion.prepareStatement("INSERT INTO prueba(foto, cam) VALUES (?, ?);");
pq.setBinaryStream(1, s, (int) file.length());
pq.setString(2, path);
pq.executeUpdate();
s.close();
} catch (ClassNotFoundException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
}
/////This way retrive the info
byte[] array = null;
String photopath = "";
try {
Conexion();
PreparedStatement p = conexion.prepareStatement("SELECT foto, cam FROM prueba;");
ResultSet sq = p.executeQuery();
while (sq.next()) {
array = sq.getBytes("foto");
photopath = sq.getString("cam");
//jLabel3.setIcon(new ImageIcon(array));
break;
}
sq.close();
p.close();
} catch (ClassNotFoundException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Add.class.getName()).log(Level.SEVERE, null, ex);
}
ImageIcon icon=new ImageIcon(array);