我正在尝试使用JAI在图像上执行旋转任务。我可以让这个工作没有问题。但是,图像中的中间调会严重丢失。图像可以在Photoshop中旋转,而不会出现对比度差异。
请看这里相邻的3张图片,看看我的意思;
顶部图像是原始图像,中间是在photoshop中旋转以证明它可以完成,底部是我的代码的结果。
要查看实际图像,请参阅此处;
旋转前:http://imgur.com/eiAOO.jpg 旋转后:http://imgur.com/TTUKS.jpg
如果您将图片加载到两个不同的标签中,并在它们之间轻弹,则可以最清楚地看到问题。
在代码方面,我按如下方式加载图像;
public void testIt() throws Exception {
File source = new File("c:\\STRIP.jpg");
FileInputStream fis = new FileInputStream(source);
BufferedImage sourceImage = ImageIO.read(fis);
fis.close();
BufferedImage rotatedImage = doRotate(sourceImage, 15);
FileOutputStream output = new FileOutputStream("c:\\STRIP_ROTATED.jpg");
ImageIO.write(rotatedImage, "JPEG", output);
}
然后这是旋转功能;
public BufferedImage doRotate(BufferedImage input, int angle) {
int width = input.getWidth();
int height = input.getHeight();
double radians = Math.toRadians(angle / 10.0);
// Rotate about the input image's centre
AffineTransform rotate = AffineTransform.getRotateInstance(radians, width / 2.0, height / 2.0);
Shape rect = new Rectangle(width, height);
// Work out how big the rotated image would be..
Rectangle bounds = rotate.createTransformedShape(rect).getBounds();
// Shift the rotated image into the centre of the new bounds
rotate.preConcatenate(
AffineTransform.getTranslateInstance((bounds.width - width) / 2.0, (bounds.height - height) / 2.0));
BufferedImage output = new BufferedImage(bounds.width, bounds.height, input.getType());
Graphics2D g2d = (Graphics2D) output.getGraphics();
// Fill the background with white
g2d.setColor(Color.WHITE);
g2d.fill(new Rectangle(width, height));
RenderingHints hints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(hints);
g2d.drawImage(input, rotate, null);
return output;
}
答案 0 :(得分:1)
这显然是JAI中存在一段时间的错误:
最早提到我能够找到这个问题appears here。原始文章指向old jai-core issue here。阅读完该解决方案后,似乎仍存在一个仍然打开的root bug described here。
无论所有侦探工作是否与您的应用程序相关,都可以构建一个比JAI用于测试代码的默认值更宽容的颜色空间。
在绝对最坏的情况下,您可以自己编写像素遍历来创建旋转图像。这不是最佳解决方案,但如果您今天绝对需要解决此问题的解决方案,我提及它是完整的。