当前位置: 首页 > 知识库问答 >
问题:

在Java中旋转缓冲图像

海典
2023-03-14

我已经用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个答案

雍宇定
2023-03-14

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

这是修改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中)。到目前为止,我发现的唯一东西是g2d.drawImage(image,affinetransform,ImageObserver)。不幸的是,我需要在特定点绘制图像,并且没有一种方法带有参数1.分别旋转图像和2.允许我设置x和y。任何帮助表示赞赏 问题答案: 这就是你可以做到的。这段代码假设存在一个名为“ image”的缓冲图像(如你的评论所说)

  • 问题内容: 我已经在中绘制了一些图形,例如圆形,矩形等。 但是我想绘制一些旋转了特定程度的图形,例如旋转的椭圆。我该怎么办? 问题答案: 如果您使用plain ,则强制转换为first: 旋转整个: 要重置旋转(因此您只旋转一件事): 例:

  • 所以我有一个字节数组,代表像素数据(8位灰度)。没有头球。没什么。只是数据。我想用这些数据创建一个缓冲图像。我做的 其中w只是以像素为单位的宽度,h是以像素为单位的高度,数据是字节数组,图像是BufferedImage 这是我的作画方法 然而,我得到了这个图像(真实图像是指纹,大部分是白色像素) 出什么事了?我试着按原样保存数据,然后在Photoshop中查看。数据很好。 [编辑]别管这个问题。我

  • 在我的应用程序中,图像是从相机捕获的,然后显示在 我已经成功地完成了此方法,但是当我的图像显示在中时,图像显示在旋转后 我想旋转图像,然后在中显示 当我单击前摄像头上的图像时,在下面代码的帮助下,图像显示正确 但当我从后摄像头点击时,图像将显示在前摄像头的对面。还有一件事,当我从不同角度单击“来自摄影机的图像”时,图像将以不同角度显示在中。

  • 问题内容: 我有一张Pan Card的图像,当我尝试将其旋转45度并保存时,会得到裁剪的图像。旋转图像的代码是: 问题答案: 使用AffineTransform看一下这个例子: http://www.billthelizard.com/2008/07/rotate-image-in- java.html 有一些代码可以加载图像,这就是核心:

  • 问题内容: 当用户单击按钮时,我正在旋转图像。但这是行不通的。 我想看到图像逐渐旋转90度直到停止,但没有旋转。单击该按钮时,图像必须逐渐旋转90度。 我创建了一个SSCCE来演示该问题。请使用您选择的任何图像替换班级中的图像。只需将图像放在文件夹中并命名。 它包含主要方法。 问题答案: 除了@tulskiy的有益观察之外,我还要补充两点: 始终在事件分发线程上构造GUI ,如下所示。 一个ssc