You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-users@xmlgraphics.apache.org by Kris Wolff <kw...@intra-team.de> on 2007/01/14 00:33:47 UTC

cmyk2rgb color convension

Hi folks,

a long while ago (2001) Thomas Kübler posted a source to this list  
(fop-dev@xml.apache.org)  to convert rgb images to cmyk with icc  
profiles:
http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-dev/ 
200111.mbox/%3C005c01c171a2$35d97950$3c00a8c0@entwickler%3E

(becuse this is more a jai question i post it to jai list, too)

I tryed to change all cmyk to rgb and all rgb to cmyk to do the other- 
way-round. But i faild with an
java.lang.IllegalArgumentException: Numbers of source Raster bands  
and source color space components do not match
         at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java: 
437)
         at  
com.sun.media.jai.opimage.ColorConvertOpImage.computeRectNonColorSpaceJA 
I(ColorConvertOpImage.java:369)
         at com.sun.media.jai.opimage.ColorConvertOpImage.computeRect 
(ColorConvertOpImage.java:289)
         at javax.media.jai.PointOpImage.computeTile 
(PointOpImage.java:919)
         at com.sun.media.jai.util.SunTileScheduler.scheduleTile 
(SunTileScheduler.java:912)
         at javax.media.jai.OpImage.getTile(OpImage.java:1139)
         at javax.media.jai.PlanarImage.copyData(PlanarImage.java:2356)
         at javax.media.jai.PlanarImage.copyData(PlanarImage.java:2292)
         at javax.media.jai.RenderedOp.copyData(RenderedOp.java:2296)
         at nextgen.cmyk2rgb_ICC.main(cmyk2rgb_ICC.java:81)

can someont tell me how to do the trick cmyk2rgb?? I need it because  
i have to display cmyk images in a renderd png, but png output of fop  
can not handle cmyk, so i need to transfer them into rgb.


Thank you in advanced,
ven


PS my code so far:

/*
* cmyk_handles.java
*
* Created on January 13, 2007, 11:20 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package nextgen;

import com.sun.image.codec.jpeg.*;
import java.awt.*;
import java.awt.color.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.media.jai.*;

/**
*
* @author kriswolff
*/
public class cmyk2rgb_ICC {

     private static boolean invert = false;
     private static String cmykdatei = "/tmp/myimage.jpg";

     /** Creates a new instance of cmyk_handles */
     public cmyk2rgb_ICC() {
     }

     /**
      * @param args the command line arguments
      */
     public static void main(String[] args) {
         int[] bitsRGB = {8,8,8};

         String cmykProfile = "/Library/Application Support/Adobe/ 
Color/Profiles/Photoshop4DefaultCMYK.icc"; // icc-profile cmyk
         String rgbProfile = "/Library/Application Support/Adobe/ 
Color/Profiles/Recommended/AppleRGB.icc";// icc-profile rgb

         // Dateiname f?r die Ausgabe
         StringTokenizer st = new StringTokenizer(cmykdatei,".");
         StringBuffer buffer = new StringBuffer();
         while ( st.hasMoreTokens() ) {
             buffer.append(st.nextToken());
             buffer.append("_rgb");
             buffer.append(".jpg");
             break;
         }

         try {

             RenderedImage inputCMYK = JAI.create("fileload",cmykdatei);

             // Create a RGB Color Space from rgbProfile
             ICC_Profile p = ICC_Profile.getInstance(new  
FileInputStream(rgbProfile));
             ColorSpace csRGB = new ICC_ColorSpace(p);


             ColorModel colorModelRGB = new ComponentColorModel 
(csRGB,bitsRGB,false,false,Transparency.OPAQUE,DataBuffer.TYPE_BYTE);

             ImageLayout rgbLayout = new ImageLayout();
             rgbLayout.setColorModel(colorModelRGB);
             RenderingHints hints = new RenderingHints 
(JAI.KEY_IMAGE_LAYOUT,rgbLayout);

             rgbLayout.setSampleModel 
(colorModelRGB.createCompatibleSampleModel(inputCMYK.getWidth 
(),inputCMYK.getHeight()));

             java.awt.image.renderable.ParameterBlock pb = new  
java.awt.image.renderable.ParameterBlock();
             pb.addSource(inputCMYK);
             pb.add(colorModelRGB);
             // convert the image from rgb-colorspace to cmyk- 
colorspace with icc
             PlanarImage out = JAI.create("ColorConvert",pb,hints);

             // Damit photoshop die Bilddaten nicht invertiert  
anzeigt erfolgt
             // eine invertierung der Daten
//            pb = new java.awt.image.renderable.ParameterBlock();
//            pb.addSource(out);
//            PlanarImage out2 = JAI.create("invert",pb);

             WritableRaster rgbRaster = out.copyData();
             // ?ffnen des Output-Streams
             OutputStream datei = new FileOutputStream(buffer.toString 
());

             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder 
(datei);
             JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam 
(rgbRaster,JPEGEncodeParam.COLOR_ID_RGB);
             param.setQuality(1, false);
             encoder.encode(rgbRaster, param);
             datei.close();
             System.out.println("Bild erfolgreich gespeichert");

         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}