0

我完全被这个问题难住了。所以这是我将数组旋转 90 度的逻辑:

例子:

1 2 3 4 5.....   ^
2 6 8 7 4.....   | 
6 4 9 8 0.....   | .....THEN.....  ------>
8 3 0 5 9.....   | 

所以如果我想将它旋转 90 度,我想要的是从最底部的行向上读取数组,然后在右侧添加一个宽度。所以数组将是

8 6 2 1
3 4 6 2 
0 9 8 3
5 8 7 4
9 0 4 5

现在我将此逻辑应用于我的像素数组并将图片旋转 90 度

这是我在 Java 中的方法的代码:

public void rotate90(){

    Pixel[][] rotated = new Pixel[Iwidth][Iheight];

    int Ch = Iheight-1, Cw = 0;

    while (Cw < Iwidth){
        while (Ch > -1){
            rotated[Cw][Iheight - Ch - 1] = new Pixel(Image[Ch][Cw].getRed(), Image[Ch][Cw].getGreen(), Image[Ch][Cw].getBlue());
            Ch--;
        }
        Cw++;
        Ch = Iheight-1;
    }

    Image = rotated;


    int temp = Iheight;
    Iheight = Iwidth;
    Iwidth = temp;
}

当我调用该方法时,它会使图片出现乱码,但图片的宽度和高度是切换/交换的。

但这是我的时候,如果我尝试调用方法 TWICE,那么图片将正确旋转 180 度

如果我尝试调用方法四次,图片将是真实的。

谁能阐明我错过了什么或做错了什么?


我发现了问题,我无法回答我自己的问题,所以这是我的代码的问题:

而不是放

imageWriter.println(Iwidth + " " + Iheight);

我有一个

imageWriter.println(Iheight + " " + Iwidth);

在我的作家方法中愚蠢的我 - _ __ _ -

感谢@Marcelo 和@rolfl 提供帮助。发现了问题。

我的代码一直都是正确的,我有一个愚蠢的 1 班轮代码让我一团糟

4

3 回答 3

1

嗯,Marcelo 打败了我,但我的程序实际上运行了....

首先,要么实现一个clone()方法,要么创建一个新的构造函数Pixel,将现有的 Pixel 用于“复制”。

这种旋转作为位置的函数更容易处理......我在这里使用字符串值而不是像素来工作

public static void main(String[] args) {
    final int width = 5, height = 3;
    String[][] values = new String[height][width];
    for (int c = 0; c < width; c++) {
        for (int r = 0; r < height; r++) {
            values[r][c] = String.format("%3d", r * width + c);
        }
    }

    for (String[] row : values) {
        System.out.println(Arrays.toString(row));
    }

    System.out.println();

    int nheight = width;
    int nwidth = height;

    String[][] rotate = new String[nheight][nwidth];
    for (int c = 0; c < nwidth; c++) {
        for (int r = 0; r < nheight; r++) {
            rotate[r][c] = values[height - 1 - c][r];
        }
    }

    for (String[] row : rotate) {
        System.out.println(Arrays.toString(row));
    }
}

它产生输出

[  0,   1,   2,   3,   4]
[  5,   6,   7,   8,   9]
[ 10,  11,  12,  13,  14]

[ 10,   5,   0]
[ 11,   6,   1]
[ 12,   7,   2]
[ 13,   8,   3]
[ 14,   9,   4]
于 2013-11-05T18:11:10.530 回答
0

把它全部扔掉并使用 AffineTransform。

于 2013-11-05T22:42:36.087 回答
0

这应该可以满足您的需要:

public void rotate90() {
    Pixel[][] rotated = new Pixel[iWidth][iHeight];

    for (int x = 0; x < iWidth; x++) {
        for (int y = 0; y < iHeight; y++) {
            rotated[x][y] = image[iWidth- y - 1][x];
        }
    }

    image = rotated;

    int temp = iHeight;
    iHeight = iWidth;
    iWidth = temp;
}

我还建议您看一下java Naming Conventions。这将有助于提高代码的可读性。

于 2013-11-05T18:03:23.850 回答