Java 异常:读取PNG头时发生I/O错误!用于图像读取大小
这是我的代码:Java 异常:读取PNG头时发生I/O错误!用于图像读取大小,java,spring-boot,png,bufferedimage,javax.imageio,Java,Spring Boot,Png,Bufferedimage,Javax.imageio,这是我的代码: private Rectangle getImageUriImageSize(String uri) { Matcher matcher = dataUriPattern.matcher(uri); if (!matcher.find()) return null; byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2)); ByteAr
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!
我改变了这个建议
但这次我犯了错误。我使用docker,这个容器退出
那怎么办呢
还有这个
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;
}
请检查您传递的文件扩展名。它应该是PNG。请编辑您的问题,并添加完整的堆栈跟踪和导致异常的图像链接。还有,我不清楚为什么你需要3种不同的方法来做这件事。。。它们是否都因相同的异常而失败?第三个版本将是最快的,因为它只需要读取标题,而不需要解码像素数据。PS:检查了源代码PNGImageReader,PNG似乎已损坏。您应该从堆栈跟踪中获得更多信息。它可能是原始源文件,也可能是由于文件下载代码中的错误。请添加图像链接。您可能需要更改代码,以便它将堆栈跟踪打印到日志中,而不仅仅是异常消息。听起来您的图像实际上是一个JPEG错误标记为PNG。xxd file.png | head-10的前几个字节看起来像什么?@GlennRanders Pehrson似乎你是对的。但是,我不理解该文件如何产生PNGImageReader中提到的异常,因为ImageIO将通过检查字节而不是文件扩展名来查找合适的读取器。这些字节中没有任何内容看起来像PNG。
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);
}