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來計算源文件的大小

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM