2017-01-11 6 views
0

のためにこれは私のコードです:例外:I/Oエラーが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; 
    } 

それは私が

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; 


} 

が、これの提案でこれに変更エラー

exception: I/O error reading PNG header! 

を与えます私はエラーがあった。私はドッカーを使用し、このコンテナは終了します。

どうすればよいですか?

もこの

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つの異なる方法が必要な理由は明らかではありません...同じ例外を除いてすべて失敗しますか?3番目のバージョンはヘッダーを読み取るだけで、ピクセルデータをデコードする必要はありません。 – haraldK

+1

PS:ソースコード 'PNGImageReader'を確認しましたが、PNGが破損しているようです。スタックトレースからより多くの情報を取得する必要があります。オリジナルのsoureファイルでも、ファイルダウンロードコードのバグが原因でもかまいません。 – haraldK

+0

私はWeb上で画像を見ることができますが、私がubuntuで開こうとすると、pngファイルではありません。私はjpgに変更すると、私はオープンすることができます。私は20回デバッグしましたが、それに続く多くのトレースがあります。私は本当の場所を見ているのかどうか分かりません。また、ウィンドウ内ではエラーなしで開くことができます。 – mark

答えて

1

であるあなたが合格したファイルの拡張子を確認してください。それはPNGでなければなりません。

関連する問題