2013-04-24 145 views
3

我有一堆.jpg圖像,我想用固定尺寸(以cm爲單位)在紙上用墨水打印它們。 假設image1.png是400x600像素,我想以300 dpi的分辨率打印它。 我試過使用PrinterJob和Printable實現,但似乎我無法指定DPI。 以下是代碼片段:Java - 將DPI設置爲打印圖像

PrinterJob job = PrinterJob.getPrinterJob(); 

job.setPrintable(new PrintableDeck(cardDB)); 

PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet(); 
attr.add(new PrinterResolution(300, 300, PrinterResolution.DPI)); 
attr.add(new MediaPrintableArea(8,21,210-16,296-42,MediaPrintableArea.MM)); 
attr.add(MediaSizeName.ISO_A4); 
attr.add(new Copies(1)); 
attr.add(OrientationRequested.PORTRAIT); 
attr.add(PrintQuality.HIGH); 
//attr.add(Fidelity.FIDELITY_TRUE); 

job.print(attr); 

public class PrintableDeck implements Printable { 

    BufferedImage image; 

    public PrintableDeck(DB cardDB){ 
     // This load an image into 'image'    
     BufferedImage image = cardDB.getCard(5462).getBufferedImage(); 
    } 

    public int print(Graphics graphics, PageFormat pf, int page) 
    throws PrinterException{ 

     if(page>0){ 
      return NO_SUCH_PAGE; 
     } 

     Graphics2D g2 = (Graphics2D) graphics; 
     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

     double pageHeight = pf.getImageableHeight(); 
     double pageWidth = pf.getImageableWidth(); 

     // This print ONLY ~596x842, as if page is 72 DPI 
     System.out.println("Imageable WH: "+pageWidth+" x "+pageHeight); 

     // This print correctly 400x600 
     System.out.println("Image: "+images.get(0).getWidth(null)+" x "+images.get(0).getHeight(null)); 

     g2.drawImage(image, 0, 0, null); 
     g2.dispose(); 


     return PAGE_EXISTS; 
    } 
} 

正如你可以在上面看到,我有PageFormat.getImageableHeight()〜842和PageFormat.getImageableWidth()〜595頁。如果將300 DPI,我預計這些值要高得多,約爲3000 x 2500. 我缺少什麼?

非常感謝。

回答

0

這是我的代碼,請注意我正在使用Scalr。

private String autoResizeImage(String image, int width, int dpi, String prefix) throws IllegalArgumentException, ImagingOpException, IOException { 

    File file = new File(image); 

    BufferedImage img = ImageIO.read(file); 


    BufferedImage result = Scalr.resize(img, Scalr.Method.SPEED, Scalr.Mode.FIT_TO_WIDTH, width, Scalr.OP_ANTIALIAS); 


    File outputfile = new File(prefix); 
    PNGEncodeParam penc = PNGEncodeParam.getDefaultEncodeParam(result); 

    double meter2inchRatio = 1d/0.0254d; 
    int dim = (int) (dpi * meter2inchRatio) + 1; 
    penc.setPhysicalDimension(dim, dim, 1); 

    // resize orginal image 
    JAI.create("filestore", result, outputfile.getAbsolutePath(), "PNG", penc); 

    return outputfile.getAbsolutePath(); 

}