我尝试使用小型旋转变换在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 :(得分:0)
打印图像时,图像边框处有伪影 不在原始图像中,因此图像随之出现 边界处的黑线。
我看到你的旋转图像只有-0.02弧度,大约是-1.15度。对于如此小的图像(612×72像素),这是一个非常小的角度。图像的最小单位是可以仅旋转90度或90度的倍数的像素。这些库通过仅将一些像素旋转90度来解决此问题。但是当旋转角度和图像像素尺寸都很小时,这种算法变得不那么有效 - 就像你的情况一样。这就是你看到那些黑色边框的原因。这显然不是AWT
库中的错误。如果允许,您可能需要增加旋转角度或使用高分辨率图像。此外,如果将非方形图像旋转的角度不是90度的倍数,则需要确保旋转的图像适合原始视口。如果它没有,你必须编写额外的代码来绘制从视口中掉出的图像区域。
P.S。您还应该在使用后处置Graphics2D
和BufferedImage
等资源以避免内存泄漏。例如。最后致电g2Print.dispose();
。