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