Java graphics2d imprimant l'image de haute résolution dans la carte CR80 utilisant l'imprimante de carte


J'ai un problème lors de l'impression de CR80 (taille de carte à puce) à l'aide de l'application de bureau Java. L'imprimante à cartes nommée Fargo HDP5000. La spécification de l'imprimante est de 300 dpi. Il peut imprimer normalement lorsque je redimensionne / redimensionne l'image à l'aide de la bibliothèque java getScaledInstance ou imgScalr en dimension de carte (53,98 mm x 85,6 fmm). Mais les résultats sont devenus pauvres ou pixélisés.

Mais lorsque j'essaie d'imprimer une image haute résolution à l'aide de la boîte de dialogue d'impression Windows, le résultat est très bon et net.

Toute solution comment imprimer image haute résolution en utilisant l'application java dans ces petits médias? Merci

Voici mon code:

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

Mise en œuvre:

@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

C'est parce que:

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

Fera également évoluer le img pour s'adapter aux destW -x et destH-y s'ils sont différents de la taille de l'image - cette mise à l'échelle produit l'effet pixélisé et flou. Vous pouvez définir de meilleures options d'interpolation sur graphics2D en utilisant:

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

Mais je ne recommande pas cette façon, car les interpolations graphics2D ne sont pas les meilleures que vous puissiez utiliser. Afin d'obtenir les meilleurs résultats possibles (crispiest image) la taille de l'image rendue sur Graphics2D devrait correspondre pixel à pixel avec la taille réelle de l'image. Vous pouvez dessiner le img pour être une correspondance pixel à pixel avec graphics2D en utilisant cette méthode simple:

graphics2D.drawImage(img, x, y, null);
 1
Author: Krzysztof Cichocki, 2017-08-03 08:26:05