`
feicer
  • 浏览: 133089 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ImageIO.read报错:java.lang.IllegalArgumentException: Invalid ICC Profile Data

阅读更多
在对图片进行处理过程中,发现java 不支持 某些图片的操作(放大,缩小),报一下错误:


java.lang.IllegalArgumentException: Invalid ICC Profile Data
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:753)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:596)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:554)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:309)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:431)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:547)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:880)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:864)
        at javax.imageio.ImageIO.read(ImageIO.java:1400)
        at javax.imageio.ImageIO.read(ImageIO.java:1322)
...


一般这些图片,是由扫描仪扫描,或者数码相机拍摄,并且处理时,图片的颜色空间(colorspace)为CMYK模式。
导致了ImageIO.read()方法抛出异常的原因。
一般情况为RGB模式。

在 sun 的官方网站,有该bug 的讨论:


更详细描述如下:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6245283
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6404011




在ImageIO.read方法前,把jpg图片文件从写,就不会有问题。

        	File srcImageFileGood = new File(dstImageFileName);
    		JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(srcImageFile));
    		BufferedImage image = decoder.decodeAsBufferedImage();
    		ImageIO.write(image, "JPEG", srcImageFileGood);

   

整个图片处理类顺便也发一下,希望大家能得到启示:


	/**  
     * 生成缩略图  
     * @param srcImageFile 源图片文件的File实例.  
     * @param dstImageFileName 待生成的缩略图片文件名  
     * @param maxWidth 最大宽度
     * @param maxHeight 最大高度
     * @param isScale 是否按比例缩放
     * @throws Exception  
     */  

    
    public static void makeSmallImage(File srcImageFile,String dstImageFileName, int maxWidth,int maxHeight,boolean isScale) {   
        FileOutputStream fileOutputStream = null;   
        JPEGImageEncoder encoder = null;   
        BufferedImage tagImage = null;   
        Image srcImage = null;   
        try{   
        	File srcImageFileGood = new File(dstImageFileName);
    		JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(srcImageFile));
    		BufferedImage image = decoder.decodeAsBufferedImage();
    		ImageIO.write(image, "JPEG", srcImageFileGood);
    		
            srcImage = ImageIO.read(srcImageFileGood);   
            int srcWidth = srcImage.getWidth(null);//原图片宽度   
            int srcHeight = srcImage.getHeight(null);//原图片高度   
            int dstMaxWidth = maxWidth;//目标缩略图的最大宽度 
            int dstmaxHeight = maxHeight;//目标缩略图的最大高度
            int dstWidth = srcWidth;//缩略图宽度   
            int dstHeight = srcHeight;//缩略图高度   
            float scale = 0;   
            //计算缩略图的宽和高   
            if(isScale){
                if(srcWidth>maxWidth){   
                    dstWidth = dstMaxWidth;   
                    scale = (float)srcWidth/(float)dstMaxWidth;   
                    dstHeight = Math.round((float)srcHeight/scale);   
                }   
                if(dstHeight>maxHeight){   
                    dstHeight = maxHeight;   
                    scale = (float)srcHeight/(float)maxHeight;   
                    dstWidth = Math.round((float)srcWidth/scale);   
                }
            }else{
            	dstWidth=maxWidth;
            	dstHeight=maxHeight;
            }   
            //生成缩略图   
            tagImage = new BufferedImage(dstWidth,dstHeight,BufferedImage.TYPE_INT_RGB);   
            tagImage.getGraphics().drawImage(srcImage.getScaledInstance(dstWidth, dstHeight, Image.SCALE_SMOOTH),0,0,null);   
            fileOutputStream = new FileOutputStream(dstImageFileName);   
            encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);   
            encoder.encode(tagImage);   
            fileOutputStream.close();   
            fileOutputStream = null;   
        }catch (Exception e) {
        	e.printStackTrace();
		} finally{   
            if(fileOutputStream!=null){   
                try{   
                    fileOutputStream.close();   
                }catch(Exception e){   
                }   
                fileOutputStream = null;   
            }   
            encoder = null;   
            tagImage = null;   
            srcImage = null;   
            System.gc();   
        }   
    }  


	
	/**
	 * 获取扩展名 For example:.exe .doc
	 * 
	 * @param fileName
	 * @return 扩展名
	 */
    public static String getExtention(String fileName) {
		int pos = fileName.lastIndexOf(".");
		return fileName.substring(pos);
	}

	/**
	 * 获取文件名 除扩展名
	 * 
	 * @param fileName
	 * @return 除去扩展名的文件名
	 */
    public static String getFileNameButExt(String fileName) {
		int pos = fileName.lastIndexOf(".");
		return fileName.substring(0, pos);
	}

    
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 try {
			 String imgsrc = "D:\\uploadFiles\\iphone\\1293\\9999.jpg";
			 File  file = new File(imgsrc);     	
			 //reduceImg("D:\\uploadFiles\\iphone\\1293\\9999.jpg","D:\\uploadFiles\\iphone\\1293\\9_1.jpg",800,600);
			 makeSmallImage(file,"D:\\uploadFiles\\iphone\\1293\\9_1.jpg",1000,300,true);
			 
			 System.out.println(file.getAbsolutePath());
			 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   

	}	

分享到:
评论
5 楼 wyzxzws 2014-04-19  
BufferedImage image = decoder.decodeAsBufferedImage();

这句报异常

com.sun.image.codec.jpeg.TruncatedFileException:Premature end  of file
4 楼 surpassdream 2011-11-17  
sotired 写道
貌似,在我这里重写的方法不管用

3 楼 fulianqiu 2011-08-09  
重写之后,图片的颜色不正常了
2 楼 i2534 2011-02-25  
我照楼主的方式重写后,可以正常显示了.
1 楼 sotired 2011-01-17  
貌似,在我这里重写的方法不管用

相关推荐

Global site tag (gtag.js) - Google Analytics