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);
}
質問を編集し、完全なスタックトレースと例外の原因となったイメージへのリンクを追加してください。また、3つの異なる方法が必要な理由は明らかではありません...同じ例外を除いてすべて失敗しますか?3番目のバージョンはヘッダーを読み取るだけで、ピクセルデータをデコードする必要はありません。 – haraldK
PS:ソースコード 'PNGImageReader'を確認しましたが、PNGが破損しているようです。スタックトレースからより多くの情報を取得する必要があります。オリジナルのsoureファイルでも、ファイルダウンロードコードのバグが原因でもかまいません。 – haraldK
私はWeb上で画像を見ることができますが、私がubuntuで開こうとすると、pngファイルではありません。私はjpgに変更すると、私はオープンすることができます。私は20回デバッグしましたが、それに続く多くのトレースがあります。私は本当の場所を見ているのかどうか分かりません。また、ウィンドウ内ではエラーなしで開くことができます。 – mark