我正在尝试编写一个类来编码在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张图像:热图,带有接缝的图像和重新缩放的图像。最后一张图片是一个测试,看看旋转是否有效,它应该显示旋转的图像,但颜色是扭曲的......
非常感谢帮助!
编辑:
答案 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));