Java 打印图形均匀性

标签 java swing printing graphics2d

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

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

  • 使用 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:

  1. skipped
  2. 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/

相关文章:

java - 在 Android 中使用 SAX 解析 XML

java - 如何根据可用的可见空间调整特定组件的大小?

java - 如何将文本文件内容添加到文本文件包含空格的组合框中?

java - 打印前预览 JTextArea

php - 在没有 Windows 打印对话框的情况下使用 php (javascript) 在本地打印页面

java - 向 SOAP 消息添加 header

Java:避免 StringBuilder.toString() 通过使用自定义类创建新字符串

java - 我如何在 Android Studio 中获得行号

java - 在 jframe 中添加日期选择器?

python - 在 Pygame 中使用 screen.blit 时可以使用 .format 功能吗?