2

我正在尝试使用 JAI 对图像执行旋转任务。我可以让这个工作没问题。但是,图像中的中间色调严重丢失。图像可以在 Photoshop 中旋转而不会缺乏对比度。

请在此处查看以下彼此相邻堆叠的 3 张图像,以了解我的意思;

http://imgur.com/SYPhZ.jpg

上图是原图,中间在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;
}
4

1 回答 1

1

这显然是 JAI 中存在一段时间的错误:

我能找到的关于这个问题的最早提及出现在这里。那篇原始文章在这里指出了一个旧的 jai-core 问题。阅读了该解决方案后,似乎存在一个仍处于打开状态并在此处描述的根错误。

无论所有这些检测工作是否与您的应用程序相关,都可以构建一个比 JAI 用于您的测试代码的默认值更宽容的颜色空间。

在绝对最坏的情况下,您可以自己编写像素遍历来创建旋转图像。这不是最佳解决方案,但如果您今天绝对需要解决此问题,我会提到它的完整性。

于 2010-05-17T17:20:52.953 回答