文档章节

ImageIO.read 方法报javax.imageio.IIOException: Unsupported Image Type

lindeyi
 lindeyi
发布于 2016/12/12 15:59
字数 414
阅读 292
收藏 0

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);  
	    }  
	  

 

本文转载自:http://dsmart-30buy.iteye.com/blog/1226969

共有 人打赏支持
lindeyi
粉丝 5
博文 16
码字总数 14150
作品 0
海淀
dcm4che 转JPG图片遇到问题

@追梦的南瓜 你好,想跟你请教个问题: 你看了你的dcm4che 转JPG图片得文章,但是我安装了32位jdk1.7和jaiimageio-10_01 但是还是一直报错,错误如下,javax.imageio.IIOException: Unsuppo...

ruiwu
05/18
0
0
java[JDK1.6]怎样处理CYMK类型的图片

情况场景:用户会上传自己的图片,系统会验证此图片的宽和高是否符合要求,但是用户上传的图片 经过PS处理(ps后保存的模式是CMYK,而非RGB)此时,java中ImageIO.read(img) img是用户上传的...

花花人
2014/04/10
144
0
java获取oracle数据库blob图片字节流显示到jsp页面出错bogus marker length

最近在做项目时需要从oracle读取blob图片列表,显示到jsp页面上。使用以下代码实现,大部分图片显示正常,但是有些图片执行BufferedImage bis = ImageIO.read(is);会报错。求高手指教,这个问...

陈裕春
2013/11/06
1K
2
java 图片处理

1.读取图片 File f = new File(“c:imagesmyimage.gif”); BufferedImage bi = ImageIO.read(f); 2.写图片 BufferedImage im = new BufferedImage(0, 0, BufferedImage. TYPEINTRGB); Image......

Canaan_
2016/08/12
11
0
java上传png图片出现红色背景

java图片上传出现红色背景 java图片服务器上传图片都很正常,唯独上传png图片时,png图片变成红色背景 原因是读取上传数据时用的是ImageIO.read(inputstream)方法 解决办法是:换成jdk中的T...

livend
2016/08/26
21
0

没有更多内容

加载失败,请刷新页面

加载更多

负载均衡的解决方案有哪些

负载均衡器服务可满足大型组织的需求,支持所有数据中心和跨数据中心高可靠性场景。 本地负载均衡,通过附带或者未附带持久性覆盖选项,Incapsula支持各种负载均衡算法,以优化服务器之间的流...

上树的熊
13分钟前
1
0
Java实现在线打开word文档加盖印章/盖章/签名功能

前言: 我们知道,大型一点的OA办公系统都会有很多在线处理office办公文档的需求。其中有一点也基本绕不开,那就是为文档盖章或添加手写签名来保护文档,让被盖章的文档不再被编辑。 在Java中...

山里的红杏
20分钟前
4
0
js控制输入正负数,小数点后保留两位

//限制数字function clearNoNum(obj){ //修复第一个字符是小数点 的情况. if(obj.value !=''&& obj.value.substr(0,1) == '.'){ obj.value=""; } obj.value ...

一直在成长的程序猿
23分钟前
1
0
动态代理

具体场景 为了使代理类与被代理类对第三方有相同的函数,代理类与被代理类一般实现一个公共的interface,定义如下 public interface Subject { void rent(); void hello(String s)...

wuyiyi
27分钟前
0
0
时间字段

我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间 mysql数据库:它们分别是 date、datetime、time、timestamp和year。date :“yyyy-mm-dd”格式表示的日期值 time :“hh:...

DemonsI
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部