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);
    }
}
Author: Abraham Putra Prakasa, 2017-08-03

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);
 1
Author: Krzysztof Cichocki, 2017-08-03 08:26:05