1

我想绘制一些 Graphics2D 对象,使用 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:在 Postscript 中由 java 代码使用指令setrgbcolor生成,但我需要setcmykcolor。我能以某种方式实现这种行为吗?

4

3 回答 3

2

没有简单的方法可以做到这一点 - 因为没有用于 RGB 和 CMYK 之间转换的精确算法。如果您被迫使用 CMYK 颜色空间,您有两种方法:

  1. RGB 和 CMYK 之间的近似转换,反之亦然(http://www.javascripter.net/faq/rgb2cmyk.htm,http://www.rapidtables.com/convert/color/cmyk-to-rgb.htm

  2. 使用配置文件(RGB 到 CMYK 和反向算法

编辑:

RGB 描述计算机显示器的颜色。CMYK 描述印刷颜色。您无需关心 - CMYK 取决于打印机,只需使用 RGB,打印就可以了。

编辑 2: 如何确保打印颜色最接近所需颜色: http ://desktoppub.about.com/cs/colorcalibration/a/cal_printer.htm?terms=color+calibration

于 2013-03-19T15:16:34.573 回答
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
于 2013-10-17T14:28:07.947 回答
0

我认为您正在寻找 java.awt.Color 类

所以:g.setColor(新颜色(200,10,15));//注意数字是 0 到 255 之间的 r,g,b

于 2013-03-19T14:57:18.640 回答