`
Dsmart_30buy
  • 浏览: 6329 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

将CMYK彩色空间的图片转换为RGB彩色空间的图片

    博客分类:
  • Java
 
阅读更多

  最近给网站增加一个会员头像的功能,这就必然的会有用户上传图片然后压缩啊,剪裁啊 什么什么的。

   做出来了,自己独自测试,通过了。然后交由老大验收,结果他在测试的时候,上传了一张比较大的jpg格式的图片,然后程序运行不通过了。我原本以为是图片太大导致,自己又重新测试,用了一张更大的图,通过了。这是为毛呢。然后看了看报错,Unsupport Image Type .度娘&谷哥后,原来是CMYK这么个东西,就是我自己测试的时候用的全是RGB的图片,老大测试的时候用的那张是CMYK的,然后就出现了这结果。 于是,继续度娘&谷哥,找到了一些将CMYK的图片转为RGB的源代码,COPY测试不通过。经过对几种方法的测试和"研究".ND 终于将这个问题搞定了。下面给出代码:

 

 

package com.test.common;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;


import javax.imageio.stream.ImageInputStream;


/**
 *
 * @author Dsmart
 */
public class 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("1 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("."))+"_rgb"+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 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);
    }

   
      public static void main(String[] args) throws IOException 
    { 
          String filename = "h:/img/test.jpg";
          
          CMYK cm = new CMYK();
          cm.readImage(filename);
                   
    } 
 
}

  

由于CMYK和RGB的不同,所以在转换后会出现颜色变亮。

 

0
1
分享到:
评论
3 楼 fluotao 2013-07-11  
楼主为毛的copy一直报Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
内存溢出呢
2 楼 claye88 2013-06-25  
Exception in thread "main" javax.imageio.IIOException: Not a JPEG file: starts with 0xc6 0x69
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:550)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:295)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:427)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:543)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:986)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readRaster(JPEGImageReader.java:1344)
at com.hzs.service.imageprocess.CMYK.readImage(CMYK.java:57)
at com.hzs.service.imageprocess.CMYK.main(CMYK.java:115)
1 楼 duanxian 2013-01-29  
不错,作为临时解决方案挺好。

相关推荐

    .net下的RGB图片转CMYK处理C#

    通过以上步骤,我们成功实现了在.NET环境下使用C#将RGB图像转换为CMYK图像的功能。这种方法适用于那些需要精确控制打印输出颜色的应用场景。值得注意的是,在实际项目开发中,还应该考虑到错误处理、资源管理等方面...

    彩色图片转换软件

    在IT领域,彩色图片转换软件是一种非常实用的工具,它主要功能是帮助用户将不同格式、色彩模式的图像文件进行转换,以满足特定的需求或适应不同的设备和平台。本篇文章将详细探讨彩色图片转换的相关知识点。 首先,...

    RGB_to_CMYK.zip

    RGB到CMYK颜色空间转换在图像处理领域是一项常见的任务,尤其在印刷业中尤为重要,因为CMYK模式是用于彩色印刷的标准。RGB颜色模式基于红、绿、蓝三种原色,而CMYK则使用青、洋红、黄和黑四种颜色进行组合。这个名为...

    图像中将彩色图像分别转化为三个RGB通道

    当我们谈论将彩色图像转化为三个RGB通道时,实际上是指将一个综合的彩色图像分解为三个独立的单色图像,每个图像对应于原图像的一个颜色通道:红色、绿色或蓝色。 RGB通道的概念源自彩色图像的像素表示。每个像素由...

    经典黑白和彩色图像lena图像RGB

    而"lena_color.bmp"则是RGB彩色版本,它由红(Red)、绿(Green)、蓝(Blue)三个颜色通道组成,每个通道都有8位深度,总共24位色彩。这意味着每个像素由三个数值(R、G、B)表示,每个数值的范围也是0到255。通过...

    彩色图片转换成黑白图片(VB代码).rar

    标题中的“彩色图片转换成黑白图片(VB代码).rar”表明这是一个使用Visual Basic(VB)编程语言实现的项目,目标是将彩色图像转换为黑白图像。在计算机图形处理中,这种转换通常涉及到图像的灰度化过程。接下来,我们...

    将CMYK颜色值和RGB颜色相互转换的PHP代码

    首先调用hex2rgb函数将十六进制颜色值(例如'#FF0000')转换为RGB数组,然后通过rgb2cmyk函数将得到的RGB数组转换为CMYK值。 为了理解以上过程,我们需要知道RGB和CMYK两种颜色模型的基本概念。RGB模型中,每个颜色...

    RGB与CMYK的区别.pdf

    处理彩色图片时,一般建议首先在RGB模式下进行编辑,因为它提供了更宽的色彩空间和更多的编辑可能性。一旦图像处理完成,再转换为CMYK模式以准备印刷。转换过程中,可以通过调整分色参数来优化色彩效果,减少色彩...

    报纸排版中彩色图片的处理模式比较.docx

    在报纸或杂志的排版过程中,彩色图片的处理是一个...只有在最终制版印刷前,才将图片转换为CMYK模式,同时通过优化分色参数来保证图片质量。这样不仅能够最大化保留图片的原始信息,还能确保印刷出来的效果接近预期。

    C++用Opencv将图片转化为灰度图并保存

    下面是一个简单的C++代码示例,展示了如何使用OpenCV将图片转换为灰度图: ```cpp #include #include int main() { // 加载原始图像 cv::Mat srcImage = cv::imread("before/your_image.jpg"); // 检查是否...

    图片颜色转换-图片反色处理

    例如,先将RGB图像转换为HSV,然后在HSV空间中反色,再转换回RGB,可能会得到更丰富的效果。 三、图形处理软件与编程库 实现图片反色处理,可以使用各种图形处理软件,如Adobe Photoshop、GIMP等,它们通常提供了...

    lenna.jpg 图像处理 经典图片 bmp lenna图 彩色 256*256 192kb

    此外,"Lenna.jpg"的色彩模式为彩色,这意味着它采用了某种颜色空间表示,如RGB(红绿蓝)或CMYK(青品黄黑)。在处理彩色图像时,需要考虑色彩空间转换、色彩校正等问题。比如,从RGB转换到CMYK,适用于印刷,反之...

    数字图像处理图片集256彩色图像

    7. 色彩空间转换:例如从RGB转换到灰度,或者从RGB到CMYK,适用于不同的打印和显示需求。 8. 图像编码与压缩:为了节省存储空间和传输时间,图像通常需要进行编码和压缩,如JPEG、PNG等压缩格式。 这个“标准图片...

    印刷图片处理之图片处理模式探讨.docx

    在将RGB模式的图片转换为CMYK模式时,分色参数的设置至关重要。分色参数的微调可以优化转换过程,减少色彩损失。Photoshop提供对分色参数的控制,使得用户能够在转换过程中尽可能地保留原有的色彩信息。 对于需要...

    印刷图片处理之图片处理模式探讨.pdf

    处理完成后,再将RGB模式的图片转换为CMYK模式准备印刷,这样能尽量减少色彩信息的损失。 在Photoshop中,为了在编辑时预览印刷效果,可以开启RGB模式下的CMYK预览功能。这样,即使在RGB模式下工作,也能看到接近...

    RGB 查看器 RGB 查看器

    4. 色彩代码转换:除了RGB,还可能支持其他色彩模式,如CMYK、HSV、HEX等之间的转换,方便在不同应用场景下使用。 5. 屏幕拾色:提供一个取色工具,可以直接从屏幕上选取任何颜色的RGB值,这对于需要精确配色的工作...

    RGB和CMYK通道中彩色图像的全息水印性能比较

    对于防伪打印介质,水印图像的色彩空间将从RGB转换为CMYK,这将导致水印图像失真。 为此,提出了一种用于CMYK中打印图像的全息水印方案。 进行了打印扫描实验,以验证该方案由打印机代替打印机的可行性,并使用PSNR...

    BW.zip_图片 点阵图_彩色打印_打印 点阵 图_黑白打印图片_黑白点阵图

    在探讨如何将一张bmp格式的彩色图片转换为黑白点阵图时,我们首先需要了解图像的基本构成。彩色图像通常基于RGB颜色模型,通过不同的红、绿、蓝(RGB)颜色强度的组合,来表达几乎所有颜色。而黑白图像则不同,它...

    印刷前综合技术资料全.doc

    在处理完成后,再将图片转换为CMYK模式,以准备进行印刷。在转换过程中,可以通过调整分色参数来优化色彩效果,减少色彩损失。 对于从互联网下载的图片,通常都是RGB模式,为了保证印刷效果,需要在输出前将其转换...

    秋天一键图片批量黑白V1.01图片批量变为黑白图

    总的来说,“秋天一键图片批量黑白V1.01”是一个实用的图像处理工具,借助Qt库的强大功能,提供了一键批量将彩色图片转换为黑白图片的服务,满足了用户在各种场景下的图片处理需求。通过简单操作,用户可以轻松实现...

Global site tag (gtag.js) - Google Analytics