读取一个jpg图片,后台提示 后台提示javax.imageio.IIOException: Unsupported Image Type
BufferedImage bufferImage = ImageIO.read(new FileInputStream(picUrl));
摘自网络 它们的区别在于颜色组成。 就像画画调和颜料,用红黄蓝三种颜色按照不同比例调出可以各种不同的颜色。 RGB: R.红色(Red) G.绿色(Green) B.蓝色(Blue) CMYK: C. 青色(Cyan) M. 洋红色(Magenta) Y. 黄色(Yellow) K. 黑色(blacK) RGB是光学三原色,所以普遍用于电视、电脑 CMYK是印刷用的颜色,所有彩色打印机都装着4个墨盒,就是这4种颜色 如果你的图片是用来发布在网络,那用RGB 如果你的图片需要打印,那就用CMYK,因为打印机直接打印RGB的图片会发生色彩失真
以下是参考网上方式做的测试类,结果不理想,色彩颜色会突变,效果不展示,可以自己测试。
package com.example.demo;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.junit.Test;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
/**
* <p>测试rgb模式转cmky 风险:图片色彩会变化</p>
* @author : shaominjie shaominjie 2018-12-10
* @package : com.example.demo
* @modify by reason: {新增}
*/
public class OrderTest {
@Test
public void testRead() throws IOException {
String filename = "C:\\Users\\xxx.jpg";
checkRgb(filename);
}
public void checkRgb(String filename) throws IOException {
File file = new File(filename);
// boolean isRgb;//true是Rgb否则是Cmyk
//创建输入流
ImageInputStream input = ImageIO.createImageInputStream(file);
Iterator readers = ImageIO.getImageReaders(input);
if (readers == null || !readers.hasNext()) {
throw new RuntimeException("No ImageReaders found");
}
ImageReader reader = (ImageReader) readers.next();
reader.setInput(input);
//获取文件格式
BufferedImage image;
try {
// 尝试读取图片 (包括颜色的转换).
image = reader.read(0); // RGB
// isRgb=true;
} catch (IIOException e) {
// 读取Raster (没有颜色的转换).
Raster raster = reader.readRaster(0, null);// CMYK
image = createJPEG4(raster);
// isRgb=false;
}
image.getGraphics().drawImage(image, 0, 0, null);
//String newfilename = filename.substring(0,filename.lastIndexOf("."))+"_rgb"+filename.substring(filename.lastIndexOf("."));
String newfilename = filename;
File newFile = new File("C:\\Users\\xxxxx.jpg");
FileOutputStream out = new FileOutputStream(newFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
out.close();
}
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);
}
}