ImageIO.read 方法报javax.imageio.IIOException: Unsupported Image Type
博客专区 > lindeyi 的博客 > 博客详情
ImageIO.read 方法报javax.imageio.IIOException: Unsupported Image Type
lindeyi 发表于10个月前
ImageIO.read 方法报javax.imageio.IIOException: Unsupported Image Type
  • 发表于 10个月前
  • 阅读 100
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

java在对图片处理时,使用ImageIO.read方法有时报javax.imageio.IIOException: Unsupported Image Type错,上网查发现是图片类型的问题,图片不是RGB 格式而是CMYK格式,网上说图片在进过ps软件处理后,默认是CMYK格式的。网上好多使用代码转换的程序有问题,最后看到一篇文章说http://dsmart-30buy.iteye.com/blog/1226969

找到解决方法:

 public static BufferedImage readImage(File file) throws IOException {
		 
	        return readImage(ImageIO.createImageInputStream(file));
	 }  
	 
	 public static BufferedImage readImage(InputStream stream) throws IOException {
		 
		 return readImage(ImageIO.createImageInputStream(stream));
	 }
	 
	 public static BufferedImage readImage(ImageInputStream input) throws IOException {          
	        Iterator<?> readers = ImageIO.getImageReaders(input);  
	        if(readers == null || !readers.hasNext()) {  
	           return null;
	        }  
	  
	        ImageReader reader = (ImageReader) readers.next();  
	        reader.setInput(input);  
	          
	        BufferedImage image;   
	        try {    
	            // 尝试读取图片 (包括颜色的转换).     
	            image = reader.read(0); //RGB  
	             
	        } catch (IIOException e) {    
	            // 读取Raster (没有颜色的转换).     
	            Raster raster = reader.readRaster(0, null);//CMYK    
	            image = createJPEG4(raster);  
	        }   
	            
	        return image;
	    }  
	  
	   
	  
	    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);  
	    }  
	  

 

共有 人打赏支持
粉丝 3
博文 9
码字总数 7551
×
lindeyi
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: