gpt4 book ai didi

java - 为什么这段代码只旋转正方形?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:42 24 4
gpt4 key购买 nike

我将使用此算法进行图像旋转,但我意识到它只能旋转正方形,不能旋转矩形。

谁知道为什么?

主要代码问题:

public static int[] rotate(double angle, int[] pixels, int width, int height) {
final double radians = Math.toRadians(angle);

final double cos = Math.cos(radians);
final double sin = Math.sin(radians);

final int[] pixels2 = new int[pixels.length];

for(int pixel = 0; pixel < pixels2.length; pixel++) {
pixels2[pixel] = 0xFFFFFF;
}

for(int x = 0; x < width; x++) {
for(int y = 0; y < height; y++) {
final int centerx = width / 2;
final int centery = height / 2;
final int m = x - centerx;
final int n = y - centery;
final int j = ((int) ( m * cos + n * sin ) ) + centerx;
final int k = ((int) ( n * cos - m * sin ) ) + centery;
if( j >= 0 && j < width && k >= 0 && k < height ){
pixels2[ ( y * width + x ) ] = pixels[ ( k * width + j ) ];
}
}
}
return pixels2;
}

上下文应用:

try {
BufferedImage testrot = ImageIO.read(new File("./32x32.png"));

int[] linearpixels = new int[testrot.getWidth() * testrot.getHeight()];
int c = 0;
for(int i = 0; i < testrot.getWidth(); i++){
for(int j = 0; j < testrot.getHeight(); j++){
linearpixels[c] = testrot.getRGB(i, j);
c++;
}
}

int[] lintestrot = rotate(50, linearpixels, 32, 32);
BufferedImage image = new BufferedImage(70, 70, BufferedImage.TYPE_INT_RGB);
c = 0;
for(int i = 0; i < 32; i++){
for(int j = 0; j < 32; j++){
image.setRGB(i, j, lintestrot[c]);
c++;
}
}

File outputfile = new File("test002.bmp");
ImageIO.write(image, "bmp", outputfile);

} catch (IOException e1) {
e1.printStackTrace();
}

如果您将宽度或高度更改为 33,结果将是错误的(错误的图像)。

最佳答案

您的算法确实有效。问题在于上下文应用程序中的循环。因为像素是按光栅顺序存储的,所以外循环需要迭代高度,内循环迭代宽度,例如:

for(int i = 0; i < testrot.getHeight(); i++){
for(int j = 0; j < testrot.getWidth(); j++){
linearpixels[c] = testrot.getRGB(j, i); //edit here, tested
c++;
}
}

然后,如果您将高度更改为 40,例如:

int[] lintestrot = rotate(50, linearpixels, 32, 40);

循环需要像这样改变:

c = 0;
for(int i = 0; i < 40; i++){
for(int j = 0; j < 32; j++){
image.setRGB(i, j, lintestrot[c]);
c++;
}
}

请注意,与函数调用(宽度然后高度)相比,循环中的顺序(高度然后宽度)是相反的。

关于java - 为什么这段代码只旋转正方形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43728763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com