原文链接: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);
}
浙公网安备 33010602011771号