旋转BufferedImage改变其颜色

时间:2016-11-11 15:27:55

标签: java bufferedimage image-rotation affinetransform seam-carving

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

我找到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

3 个答案:

答案 0 :(得分:2)

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

如果你改变它应该有效:

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

答案 1 :(得分:2)

问题在于AffineTransformOp您需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR

而不是你现在拥有的BILINEAR。

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

  

此类使用仿射变换执行线性映射   源图像中的2D坐标或中的Raster到2D坐标   目标图像或光栅。使用的插值类型是   通过构造函数指定,由RenderingHints对象或   通过此类中定义的整数插值类型之一。如果一个   RenderingHints对象在构造函数中指定   插值提示和渲染质量提示用于设置   此操作的插值类型。

     

显色提示和   当需要颜色转换时,可以使用抖动提示。注意   必须满足以下约束:源和   目的地必须不同。对于Raster对象,波段数   在源中必须等于目标中的波段数。

所以这是有效的

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

答案 2 :(得分:0)

以bhavya所说的话为基础...

保持简单,您应该使用操作期望的尺寸:

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