【问题标题】:Java Printing Graphics UniformityJava 打印图形一致性
【发布时间】:2013-08-07 15:05:59
【问题描述】:

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

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

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

【问题讨论】:

  • 检查您是如何构建缓冲图像的,尤其是任何 drawLine 或 fillRect 方法。正如您所说,构建自己的缓冲图像将提供最一致的打印结果。
  • 请问为什么 currentManager.setDoubleBufferingEnabled(false);
  • @mrKorbel - 我读到当您调用 JComponent.print() 时,JComponents 双缓冲会对打印产生负面影响。
  • @GilbertLeBlanc - 在上面的代码中,onScreenBuffer 图像与我在 paintComponent 方法中渲染的图像相同 - 就本示例而言,图像的绘制方式与它们在上面的最后一个 else 块。
  • 你试过 currentManager.setDoubleBufferingEnabled(true); ??

标签: java swing printing graphics2d


【解决方案1】:

我遇到了几乎同样的问题。无法回忆所有细节,但打印 DPI 是主要问题。您必须确保使用尽可能高的 DPI 进行打印,而不是默认的屏幕 DPI。

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

javax.print.attribute.standard.PrinterResolution

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

PrinterResolution 有多种使用方式:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多