我正在打印我在屏幕上绘制的一些矩形。矩形重叠,因此它看起来像一个由行和列组成的网格。一切都按预期出现在屏幕上。
我已经尝试了多种打印方式(实现可打印),但我无法获得相同的质量。
- 使用 JComponents 打印方法时出现颗粒状(即使关闭缓冲)。
- 直接重绘到打印方法 Graphics 对象会导致矩形重叠处的线条较暗,而矩形不重叠处的线条较浅(无论 alpha 合成如何)。我用这种方法尝试了各种 RenderingHints。
- 将构建的缓冲图像直接打印到打印图形可提供一致的质量,但某些线条看起来比其他线条粗,因此整列或整行的一侧会有一个粗边框。有谁知道为什么会发生这种情况?
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if(pageIndex > 2) {
return Printable.NO_SUCH_PAGE;
}
RepaintManager currentManager = RepaintManager.currentManager(this);
currentManager.setDoubleBufferingEnabled(false);
Graphics2D g2d = (Graphics2D) graphics;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_NORMALIZE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.scale(.5, .5);
if(pageIndex == 0) {
this.paint(g2d);
} else if(pageIndex == 1) {
g2d.drawImage(onScreenBuffer, null, 0, 0);
} else {
g2d.setColor(new Color(51, 98, 140));
g2d.setStroke(new BasicStroke(1f));
//GridCell inherits from Rectangle2D.Double
for (final GridCell cell : model.getCells()) {
g2d.draw(cell);
}
}
return Printable.PAGE_EXISTS;
}
最佳答案
我遇到了几乎相同的问题。无法记忆起所有细节,但打印 DPI 是主要问题。您必须确保使用尽可能高的 DPI 进行打印,而不是默认的屏幕 DPI。
(顺便说一句,您需要在生成图形时考虑到更大的 DPI)。
有javax.print.attribute.standard.PrinterResolution :
Class PrinterResolution is a printing attribute class that specifies an exact resolution supported by a printer or to be used for a print job. This attribute assumes that printers have a small set of device resolutions at which they can operate rather than a continuum.
PrinterResolution is used in multiple ways:
- skipped
- When a client needs to print a job using the client's desired resolution exactly (no more, no less), the client specifies an instance of class PrinterResolution as an attribute of the Print Job. This will fail if the Print Job doesn't support that exact resolution, and Fidelity is set to true.
有很多可用的示例,例如:Printing to Hard-Printer in java with 300dpi
关于Java 打印图形均匀性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18106993/