【问题标题】:JavaFX Printable to Image very pix-elated, but perfect to printerJavaFX Printable to Image 非常像素化,但非常适合打印机
【发布时间】:2014-12-31 06:36:53
【问题描述】:

我有一个可以完美打印到打印机的可打印对象,但是当我将它打印到图像时,它会非常像素化?

这是我设置打印机以打印和打印图像的代码

private PageFormat setupPrinter() {
    // sizing (standard is 72dpi, so multiple inches by this)
    Double height = 4d * 72d;
    Double width = 3d * 72d;
    Double margin = 0.1d * 72d;

    // now lets print it
    AttributeSet attributes = new HashAttributeSet();
    attributes.add(new Copies(1));

    PrinterJob printJob = PrinterJob.getPrinterJob();
    PageFormat pageFormat = printJob.defaultPage();

    // if there are more than 10 items, up the paper size to 6inch. 
    // This will handle up to 24 different items
    if (1 == 2) height = 6d * 72d;

    // set page size
    Paper paper = pageFormat.getPaper();

    paper.setSize(width, height);
    paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2));

    // set orientation and paper
    pageFormat.setOrientation(PageFormat.PORTRAIT);
    pageFormat.setPaper(paper);

    return pageFormat;
}

private void printToImage() {

    MyPrintable myPrintable = new MyPrintable();

    // setup our printer
    PageFormat pageFormat = setupPrinter();

    // set size of imageView, using the hieght and width values
    double imageHeight = pageFormat.getHeight();
    double imageWidth = pageFormat.getWidth();

    // create our image/graphics
    BufferedImage image = new BufferedImage((int)imageWidth, (int)imageHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics graphics = image.getGraphics();

    // color background white
    graphics.setColor(Color.WHITE);
    ((Graphics2D) graphics).fill(new Rectangle.Float(0, 0, (float)imageWidth, (float)imageHeight));

    // directly call our print method, passing graphics, pageFormat and pageIndex
    try {
        myPrintable.print(graphics, pageFormat, 0);
    } catch (PrinterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    graphics.dispose();

    // set our image
    imgReport.setImage(SwingFXUtils.toFXImage(image, null));

    // now lets show the preview pane
    reportPane.setVisible(true);
}

public void printToPrinter(ActionEvent event) {
    PrinterJob printJob = PrinterJob.getPrinterJob();
    PageFormat pageFormat = setupPrinter();

    printJob.setPrintable(new MyPrintable(), pageFormat);

    try {
        printJob.print();
    } catch (Exception e) {
        e.printStackTrace();    
    }

}

public MyPrintable() {
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if (pageIndex > 0) {
            return NO_SUCH_PAGE;
        }

        // user (0,0) is typically outside the imageable area, so we must translate
        // by the X and Y values in the pageFormat to avoid clipping
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

        // add text etc here
        ........
    }
}

这是一个像素化程度的示例。位它完全适合图像......

【问题讨论】:

    标签: java printing javafx


    【解决方案1】:

    您可以使用控制渲染质量 读这个:

    https://docs.oracle.com/javase/tutorial/2d/advanced/quality.html

    您的代码示例:

    Graphics2D graphics = (Graphics2D)image.getGraphics();
    RenderingHints rh = new RenderingHints(
             RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHints(rh);
    graphics.setColor(Color.WHITE);
    graphics.fill(new Rectangle.Float(0, 0, (float)imageWidth, (float)imageHeight));
    

    【讨论】:

    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多