0

I have problem when printing CR80 (Smartcard size) using Java desktop Application. The card printer named Fargo HDP5000. Printer specification is 300dpi. It can print normally when I resize/rescale the image using java getScaledInstance or imgScalr library into card dimension (53.98mm x 85.6fmm). But the result are become poor or pixelated.

But when I try to print high resolution image using windows print dialog, the result are very good and sharp.

Any solution how to print high resolution image using java application in such small media? Thank you

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

implementation:

@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);
    }
}
  • here's the answer on 'how do i resize an image in java' (https://stackoverflow.com/questions/244164/how-can-i-resize-an-image-using-java/4528136#4528136) - what seems to be the problem .... – Martin Frank Aug 03 '17 at 07:31

1 Answers1

1

It is because the:

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

will also do scale the img to fit the destW -x and destH-y if they are different from the image size - this scaling produces the pixelized and blurry effect. You can set better interpolation options on the graphics2D using:

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

But I don't recommend this way, as the graphics2D interpolations aren't the best one that you can possibly use. In order to achieve best possible results (crispiest image) the size of the image rendered on Graphics2D should be pixel to pixel match with the real image size. You can draw the img to be a pixel to pixel match with graphics2D using this simple method:

graphics2D.drawImage(img, x, y, null);
Krzysztof Cichocki
  • 6,294
  • 1
  • 16
  • 32