Java压缩图片ImageIO.read()报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java压缩图片ImageIO.read()报错相关的知识,希望对你有一定的参考价值。

JAVA应用中需要用到压缩图片的功能,在我本机上只要执行ImageIO.read()方法就会报错。
代码如下:

报错截图:

求大神解答,不胜感谢。而后我单独新建一个测试类执行到ImageIO.read方法也是这样,
String toPath = "D:/apache-tomcat-6.0.35/webapps/hbjtcm/tmpdir/1/20140329161617.jpg";BufferedImage sourceImg =ImageIO.read(new FileInputStream(toPath));System.out.println(sourceImg.getWidth()+"x"+sourceImg.getHeight());
图片文件是存在的,未损坏。在网上找过很多种压缩图片的方法,都是在这一步异常。有时也报Can't load standard profile: GRAY.pf错误,后加上GRAY.pf文件也是没效果,跪求解决方案,在线等。
昨天我换了bmp 和gif格式的图片,没问题读取正常,就jpg格式的会出错。异常捕捉块都不能抓取到。是不是和本地的系统有关呢?

参考技术A BufferedImage sourceImg =ImageIO.read(new FileInputStream(new File(toPath)));

或者

BufferedImage sourceImg =ImageIO.read(new File(toPath));

Java 读取/缩小图片:javax.imageio.IIOException: Unsupported Image Type

用Java来对图片进行操作:放大/缩小,resize,文件压缩

正常情况下,使用

BufferedImage image = ImageIO.read(new File("d:/test.jpg"));

或者直接使用第三方组件:net.coobird.thumbnailator

net.coobird.thumbnailator.Thumbnails
  .of(new File("d:/test.jpg"))
  .size(100,100)//比如原来像素是300x300,现在转成100x100
  .toFile(new File("d:/test_100x100.jpg"));
//实际底层也是ImageIO.read(new File("d:/test.jpg"));

有时候遇到图片读取就GG了

javax.imageio.IIOException: Unsupported Image Type
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1079)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1050)
	at javax.imageio.ImageIO.read(ImageIO.java:1448)
	at javax.imageio.ImageIO.read(ImageIO.java:1308)  

在stackoverflow上找到了解决方案:

/**
* @author: https://www.cnblogs.com/tomcatandjerry/
* @date 2020-2-26
*/
private static BufferedImage readImageWithNoError(File imageFile) { try { return ImageIO.read(imageFile); } catch (Exception e) { try { //Find a suitable ImageReader Iterator readers = ImageIO.getImageReadersByFormatName("JPEG"); ImageReader reader = null; while (readers.hasNext()) { reader = (ImageReader) readers.next(); if (reader.canReadRaster()) { break; } } //Stream the image file (the original CMYK image) ImageInputStream input; input = ImageIO.createImageInputStream(imageFile); if (input == null) { logger.error("ImageIO.createImageInputStream return null"); return null; } reader.setInput(input); //Read the image raster Raster raster = reader.readRaster(0, null); //Create a new RGB image BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); //Fill the new image with the old raster bi.getRaster().setRect(raster); BufferedImage greyImage = makeGrey(bi); return greyImage; } catch (Exception e1) { logger.error("readImageWithNoError: error", e1); return null; } } } //对图片做灰化处理 public static BufferedImage makeGrey(BufferedImage img) { //更换图片图层: https://www.cnblogs.com/tomcatandjerry/ BufferedImage bufferedImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_3BYTE_BGR); bufferedImage.getGraphics().drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null); bufferedImage = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB), null).filter(img, bufferedImage); return bufferedImage; }

  

这样就可以正常操作图片了。

>! 注意: 如果是ImageIO.read()出错的文件,转换后,如果按jpg/或者其他方式生成图片,大小跟源文件不同的。如果需要按文件大小来缩放,需要生成一个临时的jpg文件File,用这个File来计算源文件的大小

 

以上是关于Java压缩图片ImageIO.read()报错的主要内容,如果未能解决你的问题,请参考以下文章

java 图片压缩

您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片?

ImageIO.read() 返回 null

Java处理某些图片红色问题

java实现图片的合并与缩放

java如何将多张图片连接成一张图片