有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我也有同样的问题。无法回忆起所有细节,但打印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