2010-06-16 140 views
3

我編寫了一個程序,該程序生成一個BufferedImage以顯示在屏幕上,然後打印出來。部分圖像包含1像素寬的網格線。也就是說,這條線是1個像素,線之間有大約10個像素。由於屏幕分辨率的原因,圖像顯示得比這更大,每行有幾個像素。我想繪製它更小,但是當我縮放圖像(通過使用Image.getScaledInstance或Graphics2D.scale)時,我失去了大量的細節。java設置圖像的分辨率和打印尺寸

我想打印圖像,並處理相同的問題。在這種情況下,我使用此代碼來設置分辨率:

HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet(); 
PrinterResolution pr = new PrinterResolution(250, 250, ResolutionSyntax.DPI); 
set.add(pr); 
job.print(set); 

它可以使圖像變小而不會丟失細節。但問題是,圖像在相同的邊界被切斷,就好像我沒有設置分辨率一樣。我也很困惑,因爲我希望更多的DPI能夠製作出更小的圖像,但是它正在以另一種方式發揮作用。

我在eclipse上使用Windows 7上的Java 1.6。

回答

0

這聽起來像你的問題是,你正在使網格線BufferedImage的一部分,並且它縮放時看起來不好。爲什麼不使用drawLine()在繪製圖像後生成網格?

+0

我不確定你的建議。也許我應該縮放圖像,然後畫線?我不想縮放圖像或線條,而我的屏幕和打印機都有大量的DPI來顯示所有細節。我提到了線條,但也有很多很小的(10像素方塊)圖標,如果我縮放1/2,它們就會變得模糊不清。這對我來說沒有意義,這很不容易(大概很簡單,我只是不知道該怎麼做)。 – Ingrid 2010-06-17 01:02:31

+0

Printable提供了一個Graphics2D對象:'public int print(Graphics g,PageFormat pf,int page)'。不要將您的頁面渲染爲一個巨大的像素化圖像,而應將其渲染爲矢量圖形調用:例如,多個'g.drawLine()'和'g.drawImage()'調用。 – Justin 2010-06-17 11:43:52

+0

我會試試看看它的外觀。如果我理解正確,但這隻會讓不那麼細緻的顯示效果更好。有沒有辦法顯示和打印所有的細節? – Ingrid 2010-06-17 18:38:34

-1

您可以使用以下任一方式來提高縮放質量。我相信BiCubic會有更好的效果,但比BILINEAR慢。

g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 

我也不會使用Image.getScaledInstance(),因爲它非常慢。由於我在類似的問題上掙扎,我不確定印刷。

2

關於在頁面邊界上被截斷的圖像,您是否檢查過圖形的剪輯區域?我的意思是嘗試:

System.out.println(graphics.getClipBounds()); 

並確保它被正確設置。

0

使用Java轉換具有尺寸的圖像的代碼並打印轉換後的圖像。

類別: ConvertImageWithDimensionsAndPrint.java

package com.test.convert; 

import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 

public class ConvertImageWithDimensionsAndPrint { 
    private static final int IMAGE_WIDTH = 800; 
    private static final int IMAGE_HEIGHT = 1000; 

public static void main(String[] args) { 
    try { 
     String sourceDir = "C:/Images/04-Request-Headers_1.png"; 
     File sourceFile = new File(sourceDir); 
     String destinationDir = "C:/Images/ConvertedImages/";//Converted images save here 
     File destinationFile = new File(destinationDir); 
     if (!destinationFile.exists()) { 
      destinationFile.mkdir(); 
     } 
     if (sourceFile.exists()) { 
      String fileName = sourceFile.getName().replace(".png", ""); 
      BufferedImage bufferedImage = ImageIO.read(sourceFile); 
      int type = bufferedImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : bufferedImage.getType(); 

      BufferedImage resizedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, type); 
      Graphics2D graphics2d = resizedImage.createGraphics(); 
      graphics2d.drawImage(bufferedImage, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);//resize goes here 
      graphics2d.dispose(); 

      ImageIO.write(resizedImage, "png", new File(destinationDir + fileName +".png")); 

      int oldImageWidth = bufferedImage.getWidth(); 
      int oldImageHeight = bufferedImage.getHeight(); 
      System.out.println(sourceFile.getName() +" OldFile with Dimensions: "+ oldImageWidth +"x"+ oldImageHeight); 
      System.out.println(sourceFile.getName() +" ConvertedFile converted with Dimensions: "+ IMAGE_WIDTH +"x"+ IMAGE_HEIGHT); 

      //Print the image file 
      PrintActionListener printActionListener = new PrintActionListener(resizedImage); 
      printActionListener.run(); 
     } else { 
      System.err.println(destinationFile.getName() +" File not exists"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

PrintActionListener.java的Reference

package com.test.convert; 

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

} 

}

輸出:

04-Request-Headers_1.png OldFile with Dimensions: 1224x1584 
04-Request-Headers_1.png ConvertedFile converted with Dimensions: 800x1000 

一個圖像的轉換後打印窗口將開放用於打印轉換後的圖像。窗口顯示如下,從選擇打印機名稱下拉框並點擊確定按鈕。

Print Window

0

我有同樣的問題。這是我的解決方案。

首先更改打印作業的分辨率...

PrinterJob job = PrinterJob.getPrinterJob(); 
    // Create the paper size of our preference 
    double cmPx300 = 300.0/2.54; 
    Paper paper = new Paper(); 
    paper.setSize(21.3 * cmPx300, 29.7 * cmPx300); 
    paper.setImageableArea(0, 0, 21.3 * cmPx300, 29.7 * cmPx300); 
    PageFormat format = new PageFormat(); 
    format.setPaper(paper); 
    // Assign a new print renderer and the paper size of our choice ! 
    job.setPrintable(new PrintReport(), format); 

    if (job.printDialog()) { 
     try { 
      HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet(); 
      PrinterResolution pr = new PrinterResolution((int) (dpi), (int) (dpi), ResolutionSyntax.DPI); 
      set.add(pr); 
      job.setJobName("Jobname"); 
      job.print(set); 
     } catch (PrinterException e) { 
     } 
    } 

現在你能得到你的喜歡到喜歡這個新的高分辨率紙的一切!

public class PrintReport implements Printable { 

    @Override 
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException { 
     // Convert pixels to cm to lay yor page easy on the paper... 
     double cmPx = dpi/2.54; 
     Graphics2D g2 = (Graphics2D) g; 
     int totalPages = 2; // calculate the total pages you have... 
     if (page < totalPages) { 

      // Draw Page Header 
      try { 
       BufferedImage image = ImageIO.read(ClassLoader.getSystemResource(imgFolder + "largeImage.png")); 
       g2.drawImage(image.getScaledInstance((int) (4.8 * cmPx), -1, BufferedImage.SCALE_SMOOTH), (int) (cmPx), 
         (int) (cmPx), null); 
      } catch (IOException e) { 
      } 
      // Draw your page as you like... 
      // End of Page 
      return PAGE_EXISTS; 
     } else { 
      return NO_SUCH_PAGE; 
     } 
    }