zoukankan      html  css  js  c++  java
  • 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);
        }
    

      

  • 相关阅读:
    微服务:整合 Spring Cloud Eureka
    微服务:整合 Spring Cloud Eureka
    微服务:整合 Spring Cloud Eureka
    微服务:整合 Spring Cloud Eureka
    微服务:整合 Spring Cloud Eureka
    [转] oracle 监听
    [转]PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
    [oracle]创建查看 LOCAL INDEX
    Oracle like '%...%' 优化
    IIS7上设置MIME让其支持android和Iphone的更新下载
  • 原文地址:https://www.cnblogs.com/liuna369-4369/p/14741720.html
Copyright © 2011-2022 走看看