Java graphics2d stampa di immagini ad alta risoluzione nella scheda CR80 utilizzando la stampante per schede
Ho problemi durante la stampa di CR80 (dimensione Smartcard) utilizzando l'applicazione desktop Java. La stampante per schede denominata Fargo HDP5000. Le specifiche della stampante sono 300 dpi. Può stampare normalmente quando ridimensiono / ridimensiono l'immagine usando la libreria java getScaledInstance
o imgScalr
nella dimensione della scheda (53,98 mm x 85,6 fmm). Ma il risultato sono diventati poveri o pixelated.
Ma quando provo a stampare un'immagine ad alta risoluzione usando la finestra di dialogo di stampa di Windows, i risultati sono molto buoni e nitidi.
Qualsiasi soluzione come stampare immagine ad alta risoluzione utilizzando l'applicazione java in tali piccoli media? Grazie
Ecco il mio codice:
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());
}
Attuazione:
@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);
}
}
1 answers
È perché il:
graphics2D.drawImage(img, x, y, destW, destH, 0, 0, w, h, null);
Ridimensionerà anche img
per adattarlo a destW -x
e destH-y
se sono diversi dalla dimensione dell'immagine: questo ridimensionamento produce l'effetto pixelizzato e sfocato. È possibile impostare migliori opzioni di interpolazione su graphics2D utilizzando:
graphics2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC)
Ma non consiglio in questo modo, poiché le interpolazioni di graphics2D non sono le migliori che puoi usare. Per ottenere i migliori risultati possibili (immagine crispiest) la dimensione dell'immagine renderizzata su Graphics2D
dovrebbe essere pixel a pixel partita con la dimensione reale dell'immagine. Puoi disegnare il img
per essere una corrispondenza pixel-pixel con graphics2D usando questo semplice metodo:
graphics2D.drawImage(img, x, y, null);