Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java graphics2d使用卡片打印机将高分辨率图像打印到CR80卡_Java_Windows_Image_Printing_Smartcard - Fatal编程技术网

Java graphics2d使用卡片打印机将高分辨率图像打印到CR80卡

Java graphics2d使用卡片打印机将高分辨率图像打印到CR80卡,java,windows,image,printing,smartcard,Java,Windows,Image,Printing,Smartcard,我在使用Java桌面应用程序打印CR80(智能卡大小)时遇到问题。名为Fargo HDP5000的卡片打印机。打印机规格为300dpi。当我使用javagetScaledInstance或imgScalr库将图像调整/重新缩放为卡尺寸(53.98mm x 85.6fmm)时,它可以正常打印。但结果会变得很差或像素化 但当我尝试使用windows打印对话框打印高分辨率图像时,结果非常好且清晰 如何在这样的小媒体中使用java应用程序打印高分辨率图像? 多谢各位 这是我的代码: t

我在使用Java桌面应用程序打印CR80(智能卡大小)时遇到问题。名为Fargo HDP5000的卡片打印机。打印机规格为300dpi。当我使用java
getScaledInstance
imgScalr
库将图像调整/重新缩放为卡尺寸(53.98mm x 85.6fmm)时,它可以正常打印。但结果会变得很差或像素化

但当我尝试使用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);
    }
}
这是因为:

graphics2D.drawImage(img, x, y, destW, destH, 0, 0, w, h, null);
如果与图像大小不同,还将缩放
img
以适应
destW-x
destH-y
,此缩放会产生像素化和模糊效果。可以使用以下方法在图形2D上设置更好的插值选项:

graphics2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC)
但我不推荐这种方式,因为graphics2D插值并不是您可能使用的最佳插值。为了获得最佳效果(最清晰的图像),在
图形2d
上渲染的图像大小应与实际图像大小逐像素匹配。您可以使用以下简单方法将
img
绘制为与图形2d相匹配的像素对像素:

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

下面是关于“如何在java中调整图像大小”的答案()-问题似乎出在哪里…如果我已经绘制了图像像素到像素的匹配,而没有进行缩放,您知道如何调整卡的大小吗?(53.98毫米x 85.6毫米)?Thanks首先必须使用一些好的算法将其缩放到适当的大小,然后以“像素到像素”的模式绘制缩放后的图像。