cmyk与rgb的转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用ImageIO.read读取图片
最近碰到项目需要读取图片,然后将图片进行等比压缩,在公司环境测试时压缩图片没有问题,但是部署到客户环境,使用后发现很多图片没有被转换,一直纠结为什么,通过调试发现在
// 读取图片
BufferedImage image = (BufferedImage) ImageIO.read(new File(path+ fileName));
这段代码执行之后就不继续执行代码,原以为是代码写的有问题,但后来发现代码上没有问题,度娘搜索很久之后才发现原来是与图片色彩模式有关,在公司测试时使用的图片色彩模式大多为rgb的,但是客户真正使用的时候发现大多数图片都是cmyk格式的,ImageIO.read不支持读取cmyk色彩模式的图片,这个问题在网上搜索了下,可以通过以下代码来处理:
/*读取图片*/
public void readImage(String filename) throws IOException {
File file = new File(filename);
//创建输入流
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);
//获取文件格式
String format = reader.getFormatName();
BufferedImage image;
if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) {
try {
// 尝试读取图片(包括颜色的转换).
image = reader.read(0); // RGB
} catch (IIOException e) {
// 读取Raster (没有颜色的转换).
Raster raster = reader.readRaster(0, null);// CMYK
image = createJPEG4(raster);
}
image.getGraphics().drawImage(image, 0, 0, null);
//生成新的文件名
String newfilename = filename.substring(0, filename
.lastIndexOf("."))
+ "" + filename.substring(stIndexOf("."));
File newFile = new File(newfilename);
//创建输出流
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 (inti = 0, imax = Y.length, base = 0; 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); ColorSpacecs = 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); } 以上代码是通过读取原有文件判断是否为rgb色彩模式,不为rgb色彩模式时创建新的图