java unsupported image type_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来计算源文件的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值