Java打印图形均匀性

时间:2013-08-07 15:06:00

标签: java swing printing graphics2d

我正在打印一些我在屏幕上绘制的矩形。矩形重叠,使其看起来像行和列的网格。一切都在屏幕上显示为预期。

我尝试了各种打印方式(实现可打印),但我无法获得相同的质量。

  • 使用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;
}

1 个答案:

答案 0 :(得分:1)

我有同样的问题。无法回想起所有细节,但打印DPI是主要问题。您必须确保使用尽可能高的DPI打印,而不是默认的屏幕DPI。

(顺便说一句,你需要考虑更大的DPI来生成你的图形)。

javax.print.attribute.standard.PrinterResolution

  

Class PrinterResolution是一个指定的打印属性类   打印机支持的精确分辨率或用于打印的分辨率   工作。此属性假定打印机具有一小组设备   他们可以运作而不是连续统一的决议。

     

PrinterResolution以多种方式使用:

     
      
  1. 跳过
  2.   
  3. 当客户需要使用客户端所需的打印作业时   确切地说(不多也不少),客户指定一个   类PrinterResolution的实例作为Print Job的属性。   如果打印作业不支持该确切的分辨率,这将失败,   并且Fidelity设置为true。
  4.   

有很多可用的示例,例如:Printing to Hard-Printer in java with 300dpi