2017-01-11 20 views
0

Это мой код:исключение: ошибка ввода-вывода при чтении заголовка PNG! для изображения размером чтения

private Rectangle getImageUriImageSize(String uri) { 
     Matcher matcher = dataUriPattern.matcher(uri); 
     if (!matcher.find()) return null; 
     byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2)); 
     ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); 
     Rectangle rectangle = null; 
     try { 
      BufferedImage bufferedImage = ImageIO.read(inputStream); 
      if (bufferedImage != null) { 
       rectangle = new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()); 
      } 
     } catch (IOException e) { 
      logger.warn("Error occurred when reading base64 Data URI: '{}'", e.getMessage()); 
     } finally { 
      IOUtils.closeQuietly(inputStream); 
     } 
     return rectangle; 
    } 

дает ошибку

exception: I/O error reading PNG header! 

я изменил к этому с предложением

https://stackoverflow.com/a/27108892

private Rectangle getImageUriImageSize(String uri) { 
    Matcher matcher = dataUriPattern.matcher(uri); 
    if (!matcher.find()) return null; 
    byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2)); 

    InputStream in = new ByteArrayInputStream(bytes); 


    // ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); 
    Rectangle rectangle = null; 
    try { 
     BufferedImage bufferedImage = ImageIO.read(in); 
     if (bufferedImage != null) { 
      rectangle = new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()); 
     } 
    } catch (IOException e) { 
     logger.warn("Error occurred when reading base64 Data URI: '{}'", e.getMessage()); 
    } finally { 
     IOUtils.closeQuietly(in); 
    } 
    return rectangle; 


} 

, но это я получил ошибки. Я использую докер, и этот контейнер выходит.

А что делать?

также это

public Rectangle getImageSize(String currentMerchant, String relativeUrl) {logger.info("getImageSize"); 
     String imageUrl = getImageUrl(currentMerchant, relativeUrl); 
     Rectangle rect = null; 
     FileImageInputStream imageInputStream = null; 
     try { 
      File downloadedImageFile = restTemplate.execute(
       imageUrl, 
       HttpMethod.GET, 
       null, 
       response -> { 
        InputStream inputStream = response.getBody(); 
        String fileName = getFileName(relativeUrl); 
        return saveInputStreamAs(inputStream, fileName); 
       } 
      ); 

      Iterator<ImageReader> imageReaders = getImageReaders(downloadedImageFile); 
      if (!imageReaders.hasNext()) { 
       logger.warn("Cannot find any image reader for file {}", downloadedImageFile); 
      } 
      ImageReader imageReader = imageReaders.next(); 
      imageInputStream = new FileImageInputStream(downloadedImageFile); 
      imageReader.setInput(imageInputStream, true, true); 
      rect = new Rectangle(0, 0, imageReader.getWidth(0), imageReader.getHeight(0)); 
     } catch (HttpStatusCodeException ex) { 
      logger.warn("Error getting image resource from url '{}', status: {}, message: {}", imageUrl, ex.getStatusCode(), ex.getResponseBodyAsString()); 
     } catch (IOException ex) { 
      logger.warn("Could not read image by url '{}', exception: {}", imageUrl, ex.getMessage(), ex); 
     } finally { 
      IOUtils.closeQuietly(imageInputStream); 
     } 
     return rect; 
    } 

ошибка здесь

catch (IOException ex) { 
     logger.warn("Could not read image by url '{}', exception: {}", imageUrl, ex.getMessage(), ex); 
    } 
+1

Измените свой вопрос и добавьте полную трассировку стека и ссылку на изображение, вызывающее исключение. Кроме того, мне непонятно, почему вам нужно 3 разных способа сделать это ... Неужели все они терпят неудачу с одним и тем же исключением? Третья версия будет самой быстрой, так как ей нужно только прочитать заголовки, а не декодировать пиксельные данные , – haraldK

+1

PS: Проверьте исходный код 'PNGImageReader', и кажется, что PNG поврежден. Вы должны получить больше информации из трассировки стека. Это может быть оригинальный файл soure, или это может быть связано с ошибкой в ​​коде загрузки файла. – haraldK

+0

Я могу видеть изображение в Интернете, но когда я пытаюсь открыть в ubuntu, это не файл png. Когда я перехожу на jpg, я могу открыть. Я отлаживал 20 раз, но есть много следов. Я не уверен, смотрю ли я на истинное место. Также в окнах они могут быть открыты без ошибок. – mark

ответ

1

Пожалуйста, проверьте расширение файла, которое вы проходите. Это должен быть PNG.