2013-03-19 54 views
1

我想使用java打印機制來繪製一些Graphics2D對象。所以我必須定義一個Printable的子類。CMYK中的Java打印

public class PrintCMYK() implements Printable { 
     public int print(Graphics g, PageFormat pf, int page) 
              throws PrinterException { 
      g.setColor(Color.RED); 
      g.fillOval(44, 44, 100, 100); 
     } 
} 

所以這個代碼只是打印一個紅色圓圈RGB。 Java可能會在某些CMYK中以某種方式轉換rgb顏色,以便能夠使用CMYK進行打印。但我想在這裏完全控制。所以我可以以某種方式顯式設置想要CMYK顏色。類似於

public class PrintCMYK() implements Printable { 
     public int print(Graphics g, PageFormat pf, int page) 
              throws PrinterException { 
      float[] ff = {0, 1, 0, 0}; // pure magenta 
      Color cmykColor = new Color(ColorSpace.getInstance(TYP_CMYK), ff, 1); 
      g.setPaint(cmykColor); 
      g.fillOval(44, 44, 100, 100); 
     } 
} 

此代碼無法正常工作。

UPD:在後記產生由Java代碼使用的指令setrgbcolor但我需要setcmykcolor。我能以某種方式實現這種行爲嗎?

回答

0

我認爲你正在尋找的java.awt.Color中的類

這樣: g.setColor(新顏色(200,10,15)); //注意數字是0到255之間的r,g,b

+0

但我需要CMYK,而不是RGB。 java.awt.Color是否支持CMYK? – AvrDragon 2013-03-19 14:58:17

+0

好的,我承認我不熟悉那種技術,所以我會假設提取r,g,b不是一個選項。 雖然一般調試通過了TYP_CMYK,但是在其他地方定義了一個變量,因爲您調用的方法需要一個int作爲其輸入。你可以通過ColorSpace.getInstance(ColorSpace。)找到你的選項(如果你處於一個良好的集成開發環境中) //不是有效的行,但只要鍵入。你得到你的選項列表中,我注意到TYP_CMYK是不是其中之一,但你有這個更多的經驗,可能會看到一個等效 – 2013-03-19 15:04:02

+0

即它需要int作爲它的開關輸入但是,這些整數的意思是ColorSpace類 – 2013-03-19 15:05:46

2

沒有簡單的方法來實現它 - 因爲沒有用於在RGB和CMYK之間進行轉換的確切算法。如果你被迫使用CMYK色彩空間,你有2種方式進行:

  1. RGB和CMYK和使用配置文件(RGB to CMYK and back algorithm

  2. 反之亦然( http://www.javascripter.net/faq/rgb2cmyk.htmhttp://www.rapidtables.com/convert/color/cmyk-to-rgb.htm

  3. 之間近似換算

編輯:

RGB描述電腦顯示器的顏色。 CMYK描述打印顏色。你不需要關心 - CMYK依賴於打印機,只需使用RGB,打印就可以。

編輯2: 如何確保印刷顏色是最接近期望的: http://desktoppub.about.com/cs/colorcalibration/a/cal_printer.htm?terms=color+calibration

+0

但我並不需要/想轉換爲RGB,我已經使用CMYK值和典型的打印機使用cmyk。所以我只需要設置一個cmyk顏色,沒有任何轉換。但我無法在Grapics2D中找到任何界面來完成此操作。 – AvrDragon 2013-03-19 15:20:35

+0

RGB描述了計算機的顏色。 CMYK描述打印顏色。你不需要關心 - CMYK依賴於打印機,只需使用RGB,打印就可以。 – 2013-03-19 15:30:07

+0

不幸的是我需要關心它,實際上這是我的問題。所以我只是想明確地設置cmyk顏色,並確保打印機使用相同的顏色。 – AvrDragon 2013-03-19 15:34:49

1

下面的代碼將創建具有CMYK顏色空間的EPS:

import java.io.*; 
import java.awt.*; 
import java.awt.geom.*; 
import org.apache.fop.util.CMYKColorSpace; 
import org.apache.xmlgraphics.java2d.GraphicContext; 
import org.apache.xmlgraphics.java2d.ps.EPSDocumentGraphics2D; 

public class RenderEPS { 
    public static void renderEPS(Path2D path, Color color, String filename) throws Exception { 
     EPSDocumentGraphics2D graphics = new EPSDocumentGraphics2D(false); 
     FileOutputStream fileOutputStream = new FileOutputStream(filename); 
     graphics.setupDocument(fileOutputStream, 200, 200); 
     graphics.setGraphicContext(new GraphicContext()); 
     graphics.setPaint(color); 
     graphics.scale(50, 50); 
     graphics.fill(path); 
     graphics.finish(); 
    } 

    public static void main(String[] args) { 
     Path2D path = new Path2D.Double(); 
     path.moveTo(2, 1); 
     path.lineTo(3, 2); 
     path.lineTo(2, 3); 
     path.lineTo(1, 2); 
     path.lineTo(2, 1); 

     float[] colorComponents = {1, 0, 0, 0}; // CMYK cyan 
     Color color = new Color(CMYKColorSpace.getInstance(), colorComponents, 1f); 

     try { 
      renderEPS(path, color, "cmyk.eps"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

證實:

$ grep cmyk cmyk.eps 
1 0 0 0 setcmykcolor 

並通過:

$ gs -o - -sQUIET -sDEVICE=inkcov cmyk.eps 
0.01057 0.00000 0.00000 0.00000 CMYK OK