1

我正在尝试编写一个类来缝合 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 张图像:一张热图、一张带有接缝的图像和一张重新缩放的图像。最后一张图片是一个测试,看看旋转是否有效,它应该显示一个旋转的图像,但颜色失真......

帮助将不胜感激!

编辑:

在此处输入图像描述

4

3 回答 3

5

问题在于AffineTransformOp您需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR

而不是您现在拥有的 BILINEAR。

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

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

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

所以这行得通

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
于 2016-11-11T16:46:53.473 回答
2

似乎由于传递nullop.filter(imgIn2, null);.

如果你这样改变它应该可以工作:

BufferedImage last = new BufferedImage( imgIn2.getWidth(), imgIn2.getHeight(), imgIn2.getType() );
op.filter(imgIn2, last );
于 2016-11-11T16:32:33.377 回答
0

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

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

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage destinationImage = op.filter(bImage, op.createCompatibleDestImage(bImage, null));
于 2019-07-08T18:18:12.880 回答