swing Java打印图形均匀性
我正在打印我在屏幕上画的一些矩形。矩形重叠,因此看起来像一个由行和列组成的网格。屏幕上的一切都如预期的那样出现
我尝试过各种打印方法(实现可打印),但无法获得相同的质量
- 使用JComponents打印方法是粒状的(即使在缓冲关闭的情况下)李>
- 直接重绘到print method Graphics对象会在矩形重叠处产生较暗的线条,而在矩形不重叠处产生较亮的线条(无论alpha合成)。我用这个方法尝试了各种渲染提示李>
- 将构造好的缓冲图像直接打印到打印图形可以提供一致的质量,但某些行看起来比其他行厚,因此整个列或行的一侧有一个较厚的边框。有人知道为什么会这样吗李>
@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;
}
# 1 楼答案
我也有同样的问题。无法回忆起所有细节,但打印DPI是主要问题。您必须确保打印时使用的是尽可能高的DPI,而不是默认的屏幕DPI
(顺便说一句,您需要在生成图形时考虑更大的DPI)
有javax.print.attribute.standard.PrinterResolution:
有很多例子,例如:Printing to Hard-Printer in java with 300dpi