Convert rgb to cmyk

Hi,

I want to convert rgb color to cmyk.

I used this code but the result is an image too bright:

int k = Math.min(Math.min(r,g),b);

int div = (255-k);

int c = div!=0 ? (255 - (255*r)/div) : 0;

c = c < 0 ? 0 : c;

int m = div!=0 ? (255 - (255*g)/div) : 0;

m = m < 0 ? 0 : m;

int y = div!=0 ? (255 - (255*b)/div) : 0;

y = y < 0 ? 0 : y;

k = Math.max(Math.max(r,g),b);

k = 255-k;

Anyone knows another algorithm?

[501 byte] By [leandro_80a] at [2007-9-30 1:36:11]
# 1
Java should know an algorithm...see java.awt.Color#getColorComponents(...)and java.awt.color.Colorspace#TYPE_CMYK
SebastianMa at 2007-7-16 6:13:29 > top of Java-index,Other Topics,Algorithms...
# 2
I tryied with that method but in that case the transformation lose the "k" component.I mean, the black is made with c, m and y. I tested it with photoshop.
leandro_80a at 2007-7-16 6:13:29 > top of Java-index,Other Topics,Algorithms...
# 3

package cmykrgb;

import java.awt.image.*;

import java.awt.color.*;

import java.awt.event.*;

import java.awt.*;

import java.io.*;

import java.net.*;

import com.sun.image.codec.jpeg.*;

import com.sun.glf.util.Toolbox;

/** * This program reads an RGB JPEG image and converts it to a CMYK image. Optionally,

* it can can invert the CMYK components before saving the image as some popular

* image tools use inverted value for the CMYK components.

*

* @author Vincent Hardy * @version1.0, 02/01/1999

*/

public class CMYKSave{

static final String USAGE = "java com.sun.glf.snippets.CMYKSave C:/WINDOWS/Escritorio/Jaicmm/CMYK.pf C:/WINDOWS/Escritorio/imagenes/fondo grde con simb_copei.jpg C:/WINDOWS/Escritorio/1.jpg true";

public static void main(String args[]) throws Exception{

System.out.println(args.length);

/*if(args.length<4){

System.out.println(USAGE);

System.exit(0);

}

String cmykProfile = args[0];

String rgbJPEGFile = args[1];

String cmykJPEGFile = args[2];

boolean invert = "true".equalsIgnoreCase(args[3]);*/

String cmykProfile = "C:/WINDOWS/Escritorio/Jaicmm/CMYK.pf";

String rgbJPEGFile = "C:/WINDOWS/Escritorio/imagenes/1.jpg";

String cmykJPEGFile = "C:/WINDOWS/Escritorio/imagenes/fondo grde con simb_copei.jpg";

boolean invert = false;

//

// First, load input image

//

System.out.println("llego");

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(rgbJPEGFile));

BufferedImage rgbImage = decoder.decodeAsBufferedImage();

// Create a CMYK Color Space from cmykProfile

ICC_Profile p = ICC_Profile.getInstance(new FileInputStream(cmykProfile)); //*************************

ColorSpace cmykCS = new ICC_ColorSpace(p); //*************************

OutputStream out = new FileOutputStream(cmykJPEGFile);

// ColorConvert rgbImage to CMYK

ColorSpace rgbCS = rgbImage.getColorModel().getColorSpace();

ColorConvertOp rgbToCmyk = new ColorConvertOp(rgbCS, cmykCS, null);

// Create a ColorModel for destination CMYK image

ColorModel cmykModel = new ComponentColorModel(cmykCS,

new int[] { 8, 8, 8, 8 }, // 8 bits for each C, M, Y, K

false, true, // No alpha

Transparency.OPAQUE,

DataBuffer.TYPE_BYTE);

WritableRaster cmykRaster = cmykModel.createCompatibleWritableRaster(rgbImage.getWidth(),

rgbImage.getHeight());

// Convert to CMYK now

rgbToCmyk.filter(rgbImage.getRaster(), cmykRaster);

// Invert components before saving if requested

if(invert){

System.out.println("Inverting CMYK bands");

byte swap[] = new byte[256];

for(int i=0; i<swap.length; i++){

swap = (byte)(255-i);

}

LookupTable lookup = new ByteLookupTable(0, new byte[][] { swap, swap, swap, swap });

LookupOp luop = new LookupOp(lookup, null);

cmykRaster = luop.filter(cmykRaster, cmykRaster.createCompatibleWritableRaster());

}

// Finally, save CMYK raster

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(cmykRaster, JPEGDecodeParam.COLOR_ID_CMYK);

param.setQuality(1, false);

encoder.encode(cmykRaster, param);

out.close();

System.out.println("Image saved successfully in " + cmykJPEGFile);

}

try {

// -- Convert RGBA to CMYK

// -- because JAI reads CMYK as RGBA

ICC_Profile cmyk_profile = ICC_Profile.getInstance("C:/Documents and Settings/rsornes/Desktop/jai/CMYK.pf");

ICC_ColorSpace cmyk_icp = new ICC_ColorSpace(cmyk_profile);

ColorModel cmyk_cm =

RasterFactory.createComponentColorModel(op.getSampleModel().getDataType(),

cmyk_icp,

false,

true,

Transparency.OPAQUE);

ImageLayout cmyk_il = new ImageLayout();

cmyk_il.setColorModel(cmyk_cm);

RenderingHints cmyk_hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, cmyk_il);

ParameterBlockJAI pb = new ParameterBlockJAI("format");

pb.addSource(op);

pb.setParameter("datatype", op.getSampleModel().getDataType());

op = JAI.create("format", pb, cmyk_hints);

// -- Convert CMYK to RGB

ColorSpace rgb_icp = ColorSpace.getInstance(ColorSpace.CS_sRGB );

ColorModel rgb_cm =

RasterFactory.createComponentColorModel(op.getSampleModel().getDataType(),

rgb_icp,

false,

true,

Transparency.OPAQUE);

ImageLayout rgb_il = new ImageLayout();

rgb_il.setSampleModel(rgb_cm.createCompatibleSampleModel(op.getWidth(),

op.getHeight()));

RenderingHints rgb_hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, rgb_il);

pb = new ParameterBlockJAI("colorconvert");

pb.addSource(op);

pb.setParameter("colormodel", rgb_cm);

op = JAI.create("colorconvert", pb, rgb_hints);

} catch(Exception ex) {

ex.printStackTrace();

}

}

PD: you kwon how i can convert the image CMYK to RGB...please HELP>

rsornesa at 2007-7-16 6:13:29 > top of Java-index,Other Topics,Algorithms...
# 4

Hi,

Thanks for your code.

Can u please convey to me how to incerase the Brightness of the resultimg cmyk image.

I gave this image as an input to a API which creates PDF.

But the output PDF was found to be without colour any colour.

Can you please help me in increasing the Brightness of the cmyk image.

Thanks in Advance

sooraja at 2007-7-16 6:13:29 > top of Java-index,Other Topics,Algorithms...