用Java旋转缓冲的图像

时间:2017-12-23 14:21:31

标签: java rotation bufferedimage affinetransform

我已经在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;
}

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

我真的很感激任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果将来有人遇到同样的问题,请找到答案。

这是修改后的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;
}