ImageIO.read() возвращает нулевое значение

#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 возвращается. «

Скорее всего, последнее предложение объясняет вашу проблему.


Что мне делать?

Итак, ваш подход к решению этой проблемы был бы:

  1. Убедитесь, что содержимое array соответствует вашим ожиданиям.
  2. Определите, какой это формат изображения, и что он правильно представлен. Например, если изображение было сохранено в базе данных или отправлено в сетевом запросе, убедитесь, что оно не было искажено в процессе.
  3. Убедитесь, что это поддерживаемый формат изображения; т. Е. Тот, Для которого должен быть зарегистрированный 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);