Java 旋转BuffereImage会更改其颜色

Java 旋转BuffereImage会更改其颜色,java,bufferedimage,image-rotation,affinetransform,seam-carving,Java,Bufferedimage,Image Rotation,Affinetransform,Seam Carving,我正在尝试编写一个类来在x和y方向上缝合雕刻图像。x方向起作用了,为了减小y方向,我想简单地将图像旋转90°,在已经重新缩放的图像上运行相同的代码(仅在x方向),然后将其旋转回初始状态 我找到了带有仿射翻译的东西,并尝试了一下。它实际上产生了一个旋转的图像,但是弄乱了颜色,我不知道为什么 以下是所有代码: import java.awt.image.BufferedImage; import java.awt.geom.AffineTransform; import java.awt.image

我正在尝试编写一个类来在x和y方向上缝合雕刻图像。x方向起作用了,为了减小y方向,我想简单地将图像旋转90°,在已经重新缩放的图像上运行相同的代码(仅在x方向),然后将其旋转回初始状态

我找到了带有仿射翻译的东西,并尝试了一下。它实际上产生了一个旋转的图像,但是弄乱了颜色,我不知道为什么

以下是所有代码:

import java.awt.image.BufferedImage;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.io.File;
import java.io.IOException;
import javafx.scene.paint.Color;
import javax.imageio.ImageIO;


public class example {
/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {
    // TODO code application logic here

    BufferedImage imgIn = ImageIO.read(new File("landscape.jpg"));
    BufferedImage imgIn2 = imgIn;

    AffineTransform tx = new AffineTransform();
    tx.rotate(Math.PI/2, imgIn2.getWidth() / 2, imgIn2.getHeight() / 2);//(radian,arbit_X,arbit_Y)

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    BufferedImage last = op.filter(imgIn2, null);//(sourse,destination)
    ImageIO.write(last, "JPEG", new File("distortedColors.jpg"));
}
}

只需在
BufferedImage imgIn=ImageIO.read(新文件(“landscape.jpg”)并尝试它

执行时,将获得4个图像:热图、带有接缝的图像和重新缩放的图像。最后一个图像是一个测试,看看旋转是否有效,它应该显示一个旋转的图像,但颜色扭曲

非常感谢您的帮助

编辑:


由于将
null
传递到
op.filter(imgIn2,null),似乎发生了颜色转换

如果您这样更改它,它应该可以工作:

BufferedImage last = new BufferedImage( imgIn2.getWidth(), imgIn2.getHeight(), imgIn2.getType() );
op.filter(imgIn2, last );

由于将
null
传递到
op.filter(imgIn2,null),似乎发生了颜色转换

如果您这样更改它,它应该可以工作:

BufferedImage last = new BufferedImage( imgIn2.getWidth(), imgIn2.getHeight(), imgIn2.getType() );
op.filter(imgIn2, last );

问题在于
AffineTransformOp
您需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR
而不是你现在的双线性

文档的第二段暗示了这一点

该类使用仿射变换从 源图像或光栅中的二维坐标转换为 目标图像或光栅。使用的插值类型为 通过构造函数指定,由RenderingHights对象或 通过此类中定义的整数插值类型之一。如果 RenderingHights对象是在构造函数中指定的 插值提示和渲染质量提示用于设置 此操作的插值类型

显色提示及应用 当需要颜色转换时,可以使用抖动提示。注 必须满足以下约束条件:源和 目的地必须不同。对于光栅对象,标注栏的数量 源中的频带数必须等于目标中的频带数

所以这是有效的

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

问题在于
AffineTransformOp
您需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR
而不是你现在的双线性

文档的第二段暗示了这一点

该类使用仿射变换从 源图像或光栅中的二维坐标转换为 目标图像或光栅。使用的插值类型为 通过构造函数指定,由RenderingHights对象或 通过此类中定义的整数插值类型之一。如果 RenderingHights对象是在构造函数中指定的 插值提示和渲染质量提示用于设置 此操作的插值类型

显色提示及应用 当需要颜色转换时,可以使用抖动提示。注 必须满足以下约束条件:源和 目的地必须不同。对于光栅对象,标注栏的数量 源中的频带数必须等于目标中的频带数

所以这是有效的

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

在巴维亚所说的基础上

保持简单,并应使用操作所需的尺寸:

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage destinationImage = op.filter(bImage, op.createCompatibleDestImage(bImage, null));

在巴维亚所说的基础上

保持简单,并应使用操作所需的尺寸:

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage destinationImage = op.filter(bImage, op.createCompatibleDestImage(bImage, null));

您是否调试以确保没有将错误数据写入最终图像?是否确保使用相同的颜色设置(颜色空间等)?另外,请发一个帖子,我觉得代码太多了。itt是怎么弄乱颜色的?它是否变得模糊或改变颜色,如所有绿色变为粉红色等?也许你可以展示你的图片。当然,让我很快编辑它!我确实使用了调试器,但找不到错误…@Thomas我缩短了代码以便更好地理解您是否进行了调试以确保没有将错误数据写入最终图像?是否确保使用相同的颜色设置(颜色空间等)?另外,请发一个帖子,我觉得代码太多了。itt是怎么弄乱颜色的?它是否变得模糊或改变颜色,如所有绿色变为粉红色等?也许你可以展示你的图片。当然,让我很快编辑它!我确实使用了调试程序,但找不到错误…@Thomas为了更好地理解Works,我缩短了代码,准备重新阅读AffineTransformOP的文档以找到我的错误。谢谢你,我将重新阅读AffineTransformOP的文档以找到我的错误。非常感谢。