我想使用java打印机制绘制一些Graphics2D对象。所以我必须定义Printable的子类。
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 。我能以某种方式实现这种行为吗?
答案 0 :(得分:2)
没有简单的方法 - 因为RGB和CMYK之间没有精确的转换算法。如果您被迫使用CMYK色彩空间,您有两种方法:
RGB和CMYK之间的近似转换,反之亦然(http://www.javascripter.net/faq/rgb2cmyk.htm,http://www.rapidtables.com/convert/color/cmyk-to-rgb.htm)
使用个人资料(RGB to CMYK and back algorithm)
修改强>
RGB描述了计算机显示器的颜色。 CMYK描述了打印颜色。你不需要关心它 - CMYK依赖于打印机,只需使用RGB并打印即可。
编辑2: 如何确保打印颜色最接近所需颜色: http://desktoppub.about.com/cs/colorcalibration/a/cal_printer.htm?terms=color+calibration
答案 1 :(得分: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
答案 2 :(得分:0)
我认为你正在寻找java.awt.Color类
所以: g.setColor(new Color(200,10,15)); //注意数字是r,g,b介于0和255之间