2017-08-03 54 views
0

使用Java桌面應用程序打印CR80(智能卡大小)時出現問題。名爲Fargo HDP5000的卡片打印機。打印機規格爲300dpi。當我使用java getScaledInstanceimgScalr庫調整/重新縮放圖像到卡片尺寸(53.98mm x 85.6fmm)時,它可以正常打印。但結果變得很差或像素化。Java graphics2d使用卡片打印機將高分辨率圖像打印到CR80卡片

但是,當我嘗試使用Windows打印對話框打印高分辨率圖像時,結果非常好而且清晰。

任何解決方案如何在這樣的小媒體中使用Java應用程序打印高分辨率圖像? 謝謝

這裏是我的代碼:

  try { 
      PrinterJob printJob = PrinterJob.getPrinterJob(); 
      printJob.setPrintService(printService); 

      PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 

      aset.add(OrientationRequested.PORTRAIT); 

      aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI)); 

      aset.add(new MediaPrintableArea(0.0f, 0.0f, 53.98f, 85.6f, MediaSize.MM)); 


      if (duplex) { 
       aset.add(Sides.DUPLEX); 
       mDuplex = true; 
      } else { 
       aset.add(Sides.ONE_SIDED); 
      } 

      printJob.setPrintable(this); 
      printJob.print(aset); 
     } catch (Exception PrintException) { 
      Helper.errorHandling(TAG, "printDemo", PrintException.toString()); 
     } 

實現:

@Override 
public int print(Graphics g, PageFormat pageFormat, int pageNumber) { 


    if (pageNumber > 1) { 
     System.out.println("Print job has been sent to spooler."); 
     return Printable.NO_SUCH_PAGE; 
    } 


    Graphics2D graphics2D = (Graphics2D) g; 
    graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());   

    final int printerDPI = 300; 

    double pageWidth = pageFormat.getImageableWidth() * printerDPI/POINTS_PER_INCH; //PPI = 72 
    double pageHeight = pageFormat.getImageableHeight() * printerDPI/POINTS_PER_INCH; 


    if (pageNumber == 0) {   
     final int x= 0; 
     final int y= 0; 

     final int FIXED_WIDTH = 504; 
     final int FIXED_HEIGHT = 808; 


     BufferedImage bimg; 
     try { 
      bimg = ImageIO.read(new File(filenamePath)); 
     } catch (Exception e) { 
      Helper.errorHandling(e.toString()); 
      bimg = null; 
     } 

     if (bimg == null) { 
      return; 
     } 


     int w = bimg.getWidth(); 
     int h = bimg.getHeight(); 
     int destW = (int) (w * 0.3) + x; 
     int destH = (int) (h * 0.3) + y; 

     if (w > pageWidth) { 
      destW = pageWidth; 
     } 

     if (h > pageHeight) { 
      destH = pageHeight; 
     } 


     Image img; 
     if (w != FIXED_WIDTH && h != FIXED_HEIGHT) { 
      img = bimg.getScaledInstance(FIXED_WIDTH, FIXED_HEIGHT, Image.SCALE_SMOOTH); 
      // or 
      img = Scalr.resize(bimg, Scalr.Method.ULTRA_QUALITY, FIXED_WIDTH, FIXED_HEIGHT); 
      graphics2D.drawImage(img, x, y, destW, destH, 0, 0, w, h, null); 
     } else { 
      graphics2D.drawImage(bimg, x, y, destW, destH, 0, 0, w, h, null); 
     } 


     return (Printable.PAGE_EXISTS); 
    } else { 
     return (NO_SUCH_PAGE); 
    } 
} 
+0

這裏的一對「我如何在Java中調整圖像大小」(https://stackoverflow.com/questions/答案244164/how-can-i-resize-an-image-using-java/4528136#4528136) - 什麼似乎是問題.... –

回答

1

這是因爲:

graphics2D.drawImage(img, x, y, destW, destH, 0, 0, w, h, null); 

也會做縮放img以適應destW -xdestH-y如果它們不同來自圖像大小 - 這種縮放會產生像素化和模糊的效果。您可以使用設置在Graphics2D的更好插選項:

graphics2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) 

但我不推薦這種方式,因爲Graphics2D的插值都不是你所能使用的最好的一個。爲了達到最佳效果(最清晰的圖像),在Graphics2D上呈現的圖像的大小應該與像素與實際圖像大小匹配。可以得出img是每一個像素的比賽用這種簡單的方法的Graphics2D:

graphics2D.drawImage(img, x, y, null); 
+0

如果我已經繪製圖像像素匹配沒有縮放像素匹配,你知道嗎如何適應卡的大小? (53.98mm x 85.6mm)?謝謝 –

+0

只需使用一些好的算法將其縮放到適當的大小,然後以「像素到像素」模式繪製縮放圖像。 –