在 Java 中旋转缓冲图像

Rotating buffered image in Java

我在Java中写了一个图像旋转的方法(允许旋转90度、180度和270度),但似乎不能正常工作。我显然做错了什么,但我完全无法弄清楚是什么。关于输出的问题是图像确实旋转了,但是图像有黑色部分,就像图像不在正确的位置一样。

我的第一次尝试是不使用我用作目标的结果变量,而是这样做的:

return affineTransformOp.filter(bufferedImage, null);

而且旋转的很好,画面没有黑色部分,但是颜色很奇怪,如果换了一些颜色,肤色就变成红色了。所以看到别人有同样的问题我也改了。

这是我目前拥有的:

private BufferedImage rotateImage(ImageData imageData, BufferedImage bufferedImage) {
    AffineTransform affineTransform = new AffineTransform();

    affineTransform.rotate(imageData.getRotation().getRotationAngle(), bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);

    AffineTransformOp affineTransformOp = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR);

    BufferedImage result = new BufferedImage(bufferedImage.getHeight(), bufferedImage.getWidth(), bufferedImage.getType());

    affineTransformOp.filter(bufferedImage, result);

    return result;
}

我也试过翻译图片,但没什么用。

如果有任何帮助,我将不胜感激。谢谢。

找到答案,如果以后有人遇到同样的问题。

这是修改后的 Java 方法,解决了我的问题:

private BufferedImage rotateImage(ImageRotation imageRotation, BufferedImage bufferedImage) {
    AffineTransform affineTransform = new AffineTransform();

    if (ImageRotation.ROTATION_90.equals(imageRotation) || ImageRotation.ROTATION_270.equals(imageRotation)) {
        affineTransform.translate(bufferedImage.getHeight() / 2, bufferedImage.getWidth() / 2);
        affineTransform.rotate(imageRotation.getRotationAngle());
        affineTransform.translate(-bufferedImage.getWidth() / 2, -bufferedImage.getHeight() / 2);

    } else if (ImageRotation.ROTATION_180.equals(imageRotation)) {
        affineTransform.translate(bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
        affineTransform.rotate(imageRotation.getRotationAngle());
        affineTransform.translate(-bufferedImage.getWidth() / 2, -bufferedImage.getHeight() / 2);

    } else {
        affineTransform.rotate(imageRotation.getRotationAngle());
    }

    AffineTransformOp affineTransformOp = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR);

    BufferedImage result;

    if (ImageRotation.ROTATION_90.equals(imageRotation) || ImageRotation.ROTATION_270.equals(imageRotation)) {
        result = new BufferedImage(bufferedImage.getHeight(), bufferedImage.getWidth(), bufferedImage.getType());

    } else {
        result = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), bufferedImage.getType());
    }

    affineTransformOp.filter(bufferedImage, result);

    return result;
}