4
我正在打印一些在屏幕上繪製的矩形。矩形重疊,看起來像一個行和列的網格。一切都如預期般出現在屏幕上。Java打印圖形的均勻性
我試過各種方式來打印(實現打印),但我無法獲得相同的質量。
- 使用JComponents打印方法很有顆粒感(即使有緩衝關閉)。
- 直接重繪到打印方法圖形對象會導致矩形重疊處的較暗線條,以及它們不會重合的較淺線條(無論是否使用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;
}
檢查你是如何構建緩衝的圖像,尤其是任意的drawLine和fillRect方法。正如你所說,構建自己的緩衝圖像將提供最一致的打印結果。 –
請問爲什麼currentManager.setDoubleBufferingEnabled(false); – mKorbel
@mrKorbel - 我讀到JComponents雙緩衝可以在調用JComponent.print()時影響打印。 – Dodd10x