繁体   English   中英

打印以Java旋转的图像会增加伪影

[英]Printing an image rotated in Java adds artifacts

我正在尝试使用较小的旋转变换在Java中打印一个简单的图像。 打印图像时,图像边界处会出现一些伪影,这些伪影不在原始图像中,因此图像在边界处出现这些黑线。

有人看过吗?

要复制,请运行以下代码:

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;

import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Destination;

public class TestPrintBug implements Printable
{
    public static void main(String [] args)
    {
        try
        {
            PrintService[] services = PrinterJob.lookupPrintServices();
            for (int index = 0; index < services.length; index++) 
            {
                if (services[index].getName().equalsIgnoreCase("Microsoft XPS Document Writer"))
                {
                    PrinterJob pjob = PrinterJob.getPrinterJob();
                    HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
                    attributes.add(new Destination(new File("c:/test.xps").toURI()));
                    pjob.setPrintable(new TestPrintBug(), new PageFormat());
                    pjob.setPrintService(services[index]);
                    pjob.print(attributes);
                }
            }
        }
        catch(Throwable t)
        {
            t.printStackTrace();
        }
    }

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException 
    {
        if (pageIndex == 0)
        {
            try
            {
                int width = (int)(8.5 * 72);
                int height = 1 * 72;

                BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics2D biG = bi.createGraphics();
                biG.setColor(Color.yellow);
                biG.fillRect(0, 0, width, height);

                Graphics2D g2Print = (Graphics2D)graphics;
                g2Print.transform(AffineTransform.getRotateInstance(-0.02));
                g2Print.drawImage(bi, 0, 144, null);

                return Printable.PAGE_EXISTS;
            }
            catch(Throwable t)
            {
                t.printStackTrace();
            }
        }

        return Printable.NO_SUCH_PAGE;
    }
}

打印图像时,图像边界处会出现一些伪影,这些伪影不在原始图像中,因此图像在边界处出现这些黑线。

我看到您正在仅以-0.02弧度(大约-1.15度)旋转图像。 对于很小的图像(612 X 72像素),这是一个很小的角度。 图像的最小单位是只能旋转90度或90度的倍数的像素。 这些库通过仅将某些像素旋转90度来解决此问题。 但是,当旋转角度和图像像素大小都较小时(如您所见),此算法将变得无效。 这就是您看到那些黑色边框的原因。 这显然不是AWT库中的错误。 如果允许,您可能想增加旋转角度或使用高分辨率图像。 另外,如果将非正方形图像旋转的角度不是90度的倍数,则需要确保旋转的图像适合原始视口。 如果不是,则必须编写额外的代码来绘制掉在视口之外的图像区域。

PS您还应该在使用后处置诸如Graphics2DBufferedImage类的资源,以避免内存泄漏。 例如调用g2Print.dispose(); 到底。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM