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

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值