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?
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>