【问题标题】:printing bufferedimage to a printer将缓冲图像打印到打印机
【发布时间】:2012-03-17 05:20:17
【问题描述】:

我有一个应用程序,我想从中打印图像。图像作为 BufferedImage 对象加载。问题是,当我打印图像(到 postscript 或 pdf 文件)时,质量真的很差。
当我使用其他一些工具(基本上任何可以打印图像的图片查看器应用程序)时,结果明显更好。
我知道 DPI 与分辨率可能存在一些问题,但我不确定如何计算正确的打印值。
我试图用谷歌搜索并尝试了一些方法,但似乎没有像我预期的那样工作。 基本上我只想将图像(分辨率为 3000x2000)打印到打印机(例如 DPI 为 600x600)。

这就是我创建打印作业的方式:

PrintRequestAttributeSet printAttributes = new HashPrintRequestAttributeSet();
printAttributes.add(PrintQuality.HIGH);
printAttributes.add(new PrinterResolution(600, 600 PrinterResolution.DPI)); 
printAttributes.add(new Destination(URI.create("file:/tmp/test.ps")));
PageFormat pf = printerJob.defaultPage();
Paper paper = pf.getPaper();
double xMargin = 0.0;
double yMargin = 0.0;
paper.setImageableArea(xMargin, yMargin, paper.getWidth() - 2 * xMargin, paper.getHeight() - 2 * yMargin);
pf.setPaper(paper);

// create new Printable for the specified image
printerJob.setPrintable(PrintableImage.get(image), pf)

if (printerJob.printDialog(printAttributes)) {
    printerJob.print(printAttributes);
}

image BufferedImage 并且 PrintableImage.get 返回实现 Printable 的新实例 然后实际打印是这样做的(我让我尝试但对我不起作用的注释代码)

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (image == null)
    throw new PrinterException("no image specified to be printed");

// We have only one page, and 'page' is zero-based
if (pageIndex > 0) {
    return NO_SUCH_PAGE;
}

// tranlate the coordinates (according to the orientations, margins, etc)
Graphics2D printerGraphics = (Graphics2D) graphics;

//g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

printerGraphics.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

// THIS IS A TEST - javax.printing api uses 72 DPI, but we have 600DPI set for the printer
//AffineTransform at = printerGraphics.getTransform();
//printerGraphics.scale((double)72 / (double)600, (double)72 / (double)600);
//printerGraphics.drawRenderedImage(image, null);
//printerGraphics.setTransform(at);
//if(printerGraphics != null)
    //return PAGE_EXISTS;

double scale = 72.0 / 600.0;

Dimension pictureSize = new Dimension((int)Math.round(image.getWidth() / scale), (int) Math.round(image.getHeight() / scale));


// center the image horizontaly and verticaly on the page
int xMargin = (int) ((pageFormat.getImageableWidth() - image.getWidth()) / 2);
int yMargin = (int) ((pageFormat.getImageableHeight() - image.getHeight()) / 2);
xMargin = yMargin = 0;

System.out.println(String.format("page size [%.2f x %.2f], picture size [%.2f x %.2f], margins [%d x %d]", pageFormat.getImageableWidth(), pageFormat.getImageableHeight(), pictureSize.getWidth(), pictureSize.getHeight(), xMargin, yMargin));

printerGraphics.drawImage(image, xMargin, yMargin, (int)pageFormat.getWidth(), (int)pageFormat.getHeight(), null);

//printerGraphics.drawImage(image, 0, 0, null);
//printerGraphics.drawImage(image, xMargin, yMargin, pictureSize.width, pictureSize.height, null);
//printerGraphics.drawImage(image, xMargin, yMargin, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight(), 0, 0, pictureSize.width, pictureSize.height, null);
//printerGraphics.drawImage(image, 0, 0, (int) pageFormat.getWidth() - xMargin, (int) pageFormat.getHeight() - yMargin, 0, 0, pictureSize.width, pictureSize.height, null);

return PAGE_EXISTS;
}

有人解决同样的问题吗?
任何帮助将不胜感激。
谢谢
马特杰

【问题讨论】:

    标签: java image printing dpi


    【解决方案1】:

    我就是这样做的。它工作顺利。请注意,此代码 sn-p 不会使图像居中。

    public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
                    if (pageIndex > 0) {
                        return (NO_SUCH_PAGE);
                    } else {
                        double pageHeight = pageFormat.getImageableHeight(), pageWidth = pageFormat.getImageableWidth();
    
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                        if (pageHeight < image.getHeight() || pageWidth < image.getWidth()) {
                            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                            g2d.drawImage(image, 0, 0, (int) pageWidth, (int) pageHeight - textSize, null);
                        } else {
                            g2d.drawImage(image, 0, 0, null);
                        }
                        g2d.dispose();
                        return (PAGE_EXISTS);
                    }
                }
    

    【讨论】:

      【解决方案2】:

      @Viktor Fonic 谢谢你,我正在寻找很多来做到这一点! 您的解决方案完美运行,但有一个小错误, textSize 没有声明,所以:

      int textSize =  (int) (pageHeight - image.getHeight()*pageWidth/image.getWidth());
      

      【讨论】:

        猜你喜欢
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        相关资源
        最近更新 更多