cmyk与rgb的转换.docx_第1页
cmyk与rgb的转换.docx_第2页
cmyk与rgb的转换.docx_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用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(filename.lastIndexOf(.); 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 bytew * 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, y = 255 - Y, cb = 255 - Cb, cr = 255 - Cr; double val = y + 1.402 * (cr - 128) - k; val = (val - 128) * .65f + 128; rgbbase = 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; rgbbase + 1 = val 255.0 ? (byte) 0xff : (byte) (val + 0.5); val = y + 1.772 * (cb - 128) - k; val = (val - 128) * .65f + 128; rgbbase + 2 = 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); 以上代码是通过读取原有文件判断是否为rgb色彩模式,不为rgb色彩模式时创建新的图片,并将新创建的图片以rgb模式保存,通过此方法,顺利解决了当前项目的问题。备注:此方法消耗内存,并且转换后的图片与转换前的图片存在失真的情况,所以请慎用此转换方法。简单介绍下rgb与cmyk的区别:RGB色彩模式:RGB是工业界的一中颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一,RGB的独特之处是色彩丰富饱满,但不能进行普通的分色印刷。混色设定(加法混合):RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好象有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。加法混合的特点:越叠加越明亮。CMYK色彩模式:专门用来印刷的颜色,它是另一种专门针对印刷业设定的颜色标准,是通过对青(C)、洋红(M)、黄(Y)、黑(K)四个颜色变化以及它们相互之间的叠加来得到各种颜色的,CMYK即是代表青、洋红、黄、黑四种印刷专用的油墨颜色,也是Photoshop软件中四个通道的颜色,印刷上,是通过控制青、洋红、黄、黑四色油墨在纸张上的相叠印刷来产生色彩的,它的颜色种数少于RGB色;CMYK的独特之处是色彩不如RGB色丰富饱满,在PHOTOSHOP中运行速度会比RGB色慢,而且部分功能将无法使用,由于颜色种数没有RGB色多,当图像由RGB色转为CMYK色后颜色会有部分损失(从CMYK转到RGB则没有损失),但它也是唯一一种能用来进行四色分色印刷的颜色标准。混色设定(减法混合):CMYK是以对光线的反射原理来设计定的,所以它的混合方式刚好与RGB相反,是减法混合,当它们的色彩相互叠合的时候,色彩相混,而亮度却会减低,把四种不同的油墨相叠地印在白

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论