2014-11-04 34 views
0

我有一个可打印的对象,打印完美的打印机,但是当我打印它的图像,那么它是非常像素化?JavaFX可打印图像非常像素化,但完美的打印机

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

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 
     ........ 
    } 
} 

打印机这里是它是如何像素化的一个例子。它完美的形象适合位....

enter image description here

回答

0

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

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)); 
+0

不幸的是,渲染质量对JavaFX没有什么帮助,至少现在还没有。更多信息在这里:http://stackoverflow.com/questions/37797351/ – tresf 2016-06-15 02:45:29