Java 如何创建将缓冲图像旋转90度的反转?

Java 如何创建将缓冲图像旋转90度的反转?,java,image,bufferedimage,Java,Image,Bufferedimage,我一辈子都搞不懂这个函数是如何工作的,更不用说如何创建撤销了。我正在尝试编辑这个图像编辑程序,我需要为这个rotate90过滤器添加一个撤销功能。说得清楚一点,我知道以前也有人问过类似的问题,我也见过大约20个相关的问题,但我就是不明白 public static void apply(ColorImage image) { int height = image.getHeight(); int width = image.getWidth(); for (int y

我一辈子都搞不懂这个函数是如何工作的,更不用说如何创建撤销了。我正在尝试编辑这个图像编辑程序,我需要为这个rotate90过滤器添加一个撤销功能。说得清楚一点,我知道以前也有人问过类似的问题,我也见过大约20个相关的问题,但我就是不明白

public static void apply(ColorImage image) {
    int height = image.getHeight();
    int width = image.getWidth();


    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            Color pix = image.getPixel(x, y);
            image.setPixel(height - y - 1, x, pix);
        }
    }
}
publicstaticvoidapply(彩色图像){
int height=image.getHeight();
int width=image.getWidth();
对于(int y=0;y

上面的代码假定将缓冲图像顺时针旋转90度。如何创建这个函数的倒数?< /p> < p>为了理解旋转函数是如何工作的,考虑字母f的图像,3像素宽,5像素高,90°旋转:< /p>
\  0 1 2        \  0 1 2 3 4
 +------         +----------
0| * * *        0| * * * * *
1| *            1|     *   *
2| * *          2|         *
3| *
4| *
您可以看到旋转图像中(0,0)处的
*
像素应映射到(4,0)处的像素;位于(1,0)的像素映射到位于(4,1)的像素;位于(2,0)到(4,2)的像素。。。(等)。。。最后,(0,4)处的像素映射到(0,0

第一个坐标(原始图像的
x
映射到旋转图像的
y
坐标,这一点应该很明显。(上面我用粗体标出了这些值)。这应该解释为什么
x
值在
setPixel()调用中显示为
y
坐标:

image.setPixel(???, x, pix);
原始图像的
y
坐标到旋转图像的
x
坐标的转换并不复杂。第0行成为最后一列,最后一行成为第0列。由于原始图像高5像素,旋转后的图像变为5像素宽,最后一列为
height-1
。当原始图像的
y
向下增加时,旋转图像的相应列将减小,从而为旋转的
x
列提供
height-1-y

image.setPixel(height - y - 1, x, pix);

两个问题:

1) 对于这张3像素乘5像素的图像,(0,0)处的像素映射到(4,0),这超出了
图像的范围
;在该坐标处设置像素的颜色应该会给您一个
IndexOutOfBoundsException

2) 如果图像为方形(从而避免了
IndexOutOfBoundsException
异常),则在读取原始像素值之前,您将使用转换后的像素值覆盖原始图像的某些像素值。这会破坏你的形象

以上两个问题都有一个简单的解决方案。创建并返回一个新图像


反转旋转

如果原始旋转将像素从(0,0)移动到(4,0),要反转旋转,需要将像素从(4,0)移动到(0,0)。这可以通过两种方式实现:

  • 稍微调整坐标变换,或
  • 读取转换后的像素坐标并写入非转换后的像素坐标
  • 练习留给学生。

    最少(程序员)工作量:调用函数3次。旋转270°(3 x 90°)与旋转90°相反。但你的90°旋转代码有缺陷;如果没有临时副本,则无法执行在位旋转。如果图像是正方形,则只能进行原地旋转。