Java图片读取ImageIO.read(file)报错:Unsupported Image Type 解决方案

原文链接:https://blog.csdn.net/qq_39069924/article/details/103088374

File imgFile = new File(path+imgs);

ImageIO.read(imgFile)

读取的图片文件的色彩模式为CMYK时就会抛出Unsupported Image Type的异常,一般图片的色彩模式为CMYK是因为经过了ps修过的图或者使用ps做的图。

百度到很多方法就是用ps重新更改图片,但是再实际项目中不可能让客户重新ps一遍图片

解决方案
1.使用图片编辑器,重新另存图片为jpg格式。(不推荐)
2.maven导入 twelvemonkeys
<!-- cmyk格式图片转换 -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3</version>
</dependency>
导入maven之后,不需要加任何代码,再次运行原有抛异常的代码,会发现已经可以正常读取了。

  追更--------------------------------------------------------------------------------------

继上次修改之后,又出现了下述的问题,这个错误正是从我上次导的包里面报出的,所以由此可知,和上次修改有关系 ,我就去掉了这个jar包,然后就可以正常读取,那就又回到了最初的问题,不能读取印刷模式的图片

 所以处理方法

File imgFile = new File(path+imgs);// 得到文件
Image img2=null;
try{
 img2= ImageIO.read(imgFile);// 处理RGB模式的图片
}catch (Exception e){//处理CMYK模式的图片
   ImageInputStream input = ImageIO.createImageInputStream(imgFile);
   Iterator readers = ImageIO.getImageReaders(input);
   ImageReader reader = (ImageReader) readers.next();
   reader.setInput(input);
   Raster raster = reader.readRaster(0, null);//CMYK
   img2 = createJPEG4(raster);
}
g.drawImage(img2, 2340, 800, 300, 420, null);

  

    private static BufferedImage createJPEG4(Raster raster) {
        int w = raster.getWidth();
        int h = raster.getHeight();
        byte[] rgb = new byte[w * h * 3];
        //彩色空间转换
        float[] Y = raster.getSamples(0, 0, w, h, 0, (float[]) null);
        float[] Cb = raster.getSamples(0, 0, w, h, 1, (float[]) null);
        float[] Cr = raster.getSamples(0, 0, w, h, 2, (float[]) null);
        float[] K = raster.getSamples(0, 0, w, h, 3, (float[]) null);
        for (int i = 0, imax = Y.length, base = 0; i < imax; i++, base += 3) {
            float k = 220 - K[i], y = 255 - Y[i], cb = 255 - Cb[i],
                    cr = 255 - Cr[i];

            double val = y + 1.402 * (cr - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);

            val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base + 1] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);

            val = y + 1.772 * (cb - 128) - k;
            val = (val - 128) * .65f + 128;
            rgb[base + 2] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
                    : (byte) (val + 0.5);
        }
        raster = Raster.createInterleavedRaster(new DataBufferByte(rgb, rgb.length), w, h, w * 3, 3, new int[]{0, 1, 2}, null);
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
        ColorModel cm = new ComponentColorModel(cs, false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
        return new BufferedImage(cm, (WritableRaster) raster, true, null);
    }

  

原文地址:https://www.cnblogs.com/liuna369-4369/p/14741720.html