Proper way of printing a BufferedImage in Java

后端 未结 1 1400
谎友^
谎友^ 2020-12-29 17:12

I would like to know if there is a proper way of printing a BufferedImage in Java. Basically I have created a photo manipulation program which works fine, I can

相关标签:
1条回答
  • 2020-12-29 17:55

    Here's one from one of my Java projects. This code will scale and print one image on a printer page.

    You call it like this:

        printButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                //Start a Thread
                new Thread(new PrintActionListener(image)).start();         
            }
        });
    

    Here's the Runnable:

    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    
    public class PrintActionListener implements Runnable {
    
        private BufferedImage       image;
    
        public PrintActionListener(BufferedImage image) {
            this.image = image;
        }
    
        @Override
        public void run() {
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setPrintable(new ImagePrintable(printJob, image));
    
            if (printJob.printDialog()) {
                try {
                    printJob.print();
                } catch (PrinterException prt) {
                    prt.printStackTrace();
                }
            }
        }
    
        public class ImagePrintable implements Printable {
    
            private double          x, y, width;
    
            private int             orientation;
    
            private BufferedImage   image;
    
            public ImagePrintable(PrinterJob printJob, BufferedImage image) {
                PageFormat pageFormat = printJob.defaultPage();
                this.x = pageFormat.getImageableX();
                this.y = pageFormat.getImageableY();
                this.width = pageFormat.getImageableWidth();
                this.orientation = pageFormat.getOrientation();
                this.image = image;
            }
    
            @Override
            public int print(Graphics g, PageFormat pageFormat, int pageIndex)
                    throws PrinterException {
                if (pageIndex == 0) {
                    int pWidth = 0;
                    int pHeight = 0;
                    if (orientation == PageFormat.PORTRAIT) {
                        pWidth = (int) Math.min(width, (double) image.getWidth());
                        pHeight = pWidth * image.getHeight() / image.getWidth();
                    } else {
                        pHeight = (int) Math.min(width, (double) image.getHeight());
                        pWidth = pHeight * image.getWidth() / image.getHeight();
                    }
                    g.drawImage(image, (int) x, (int) y, pWidth, pHeight, null);
                    return PAGE_EXISTS;
                } else {
                    return NO_SUCH_PAGE;
                }
            }
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题