1

我试图编写一个类在x和y方向上缝合雕刻图像。 x方向正在工作,为了减少y方向,我想简单地将图像旋转90°,并在已重新缩放的图像上(仅在x方向)上运行相同的代码,然后将其旋转回初始状态。Rotating BufferedImage改变它的颜色

我找到了AffineTransform的东西,并试了一下。它实际上产生了一个旋转的图像,但搞乱了颜色,我不知道为什么。

这是所有代码:

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(new File("landscape.jpg"));文件名和尝试。

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

帮助将不胜感激!

编辑:

enter image description here

+0

你调试,以确保你没有错误的数据写入到最终图像?你确定使用相同的颜色设置(色彩空间等)?另外请发布[mvce](http://stackoverflow.com/help/mcve),这是太多的代码IMO。 – Thomas

+0

它是如何搞乱颜色的?它变得模糊或像所有的绿色都变成了粉红色等颜色?也许你可以展示你的图片。 –

+0

当然,让我编辑它非常快! – ViktorG

回答

2

好像有一个颜色转换,由于传递nullop.filter(imgIn2, null);发生。

如果你改变它像它应该工作:

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

工程,将重新阅读AffineTransformOP的文档以查找我的错误。谢谢 – ViktorG

2

的问题是与AffineTransformOp你需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR 

,而不是你现在有双线性。

文档第二段提示了这一点。

此类使用仿射变换从 的线性映射的二维坐标的源图像或Raster到2D中坐标 目标图像或Raster英寸使用的插值类型是 ,通过构造函数指定,可以由RenderingHints对象或 通过此类中定义的整数插值类型之一来指定。如果在构造函数中指定了 RenderingHints对象,则将使用 插值提示和渲染质量提示来设置此操作的插值类型 。

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

所以此工程

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