在java中将右图像旋转90度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20959796/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Rotate 90 degree to right image in java
提问by Ertu?rul ?etin
I can not rotate image 90 degree to right . I need to be able to rotate images individually in java. The only thing. Unfortunately, I need to draw the image at a specific point, and there is no method with an argument that 1.rotates the image separately and 2. allows me to set the x and y. any help is appreciated
我无法将图像向右旋转 90 度。我需要能够在 java 中单独旋转图像。唯一的事情。不幸的是,我需要在特定点绘制图像,并且没有带有参数的方法 1. 单独旋转图像 2. 允许我设置 x 和 y。任何帮助表示赞赏
public class Tumbler extends GraphicsProgram{
public void run() {
setSize(1000,1000);
GImage original = new GImage("sunset.jpg");
add(original, 10, 10);
int[][] pixels = original.getPixelArray();
int height = pixels.length;
int width = pixels[0].length;
// Your code starts here
int newheight = width;
int newwidth = height;
int[][] newpixels = new int[newheight][newwidth];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
newpixels[j][height-1-i] = pixels[i][j];
}
}
GImage image = new GImage(newpixels);
add(image, width+20, 10);
// Your code ends here
}
采纳答案by trashgod
As discussed here, you can use AffineTransformOp
to rotate an image by Math.PI / 2
; this is equivalent to rotating the image clockwise 90°, as shown here. See also Handling 90-Degree Rotations.
正如这里所讨论的,您可以使用以下AffineTransformOp
方式旋转图像Math.PI / 2
;这相当于对图像进行顺时针旋转90°,如图所示在这里。另请参阅处理 90 度旋转。
回答by Ken
Here is the code I used to rotate a BufferedImage clockwise 90 degrees. Since rotating by 90 degrees is a special case, I didn't think a solution that was generic for any angle would have optimal performance. Likewise for solutions that perform some sort of interpolation (bilinear, bicubic, etc.) I used BufferedImage.getRaster() to access the raw bytes in order to improve performance, but depending on the structure/layout of the image, this is not likely to work in all cases. YMMV.
这是我用来将 BufferedImage 顺时针旋转 90 度的代码。由于旋转 90 度是一种特殊情况,我认为对于任何角度通用的解决方案都不会具有最佳性能。同样,对于执行某种插值(双线性、双三次等)的解决方案,我使用 BufferedImage.getRaster() 访问原始字节以提高性能,但根据图像的结构/布局,这不太可能在所有情况下工作。天啊。
public static BufferedImage rotateClockwise90(BufferedImage src) {
int srcWidth = src.getWidth();
int srcHeight = src.getHeight();
boolean hasAlphaChannel = src.getAlphaRaster() != null;
int pixelLength = hasAlphaChannel ? 4 : 3;
byte[] srcPixels = ((DataBufferByte)src.getRaster().getDataBuffer()).getData();
// Create the destination buffered image
BufferedImage dest = new BufferedImage(srcHeight, srcWidth, src.getType());
byte[] destPixels = ((DataBufferByte)dest.getRaster().getDataBuffer()).getData();
int destWidth = dest.getWidth();
int srcPos = 0; // We can just increment this since the data pack order matches our loop traversal: left to right, top to bottom. (Just like reading a book.)
for(int srcY = 0; srcY < srcHeight; srcY++) {
for(int srcX = 0; srcX < srcWidth; srcX++) {
int destX = ((srcHeight - 1) - srcY);
int destY = srcX;
int destPos = (((destY * destWidth) + destX) * pixelLength);
if(hasAlphaChannel) {
destPixels[destPos++] = srcPixels[srcPos++]; // alpha
}
destPixels[destPos++] = srcPixels[srcPos++]; // blue
destPixels[destPos++] = srcPixels[srcPos++]; // green
destPixels[destPos++] = srcPixels[srcPos++]; // red
}
}
return dest;
}
回答by Charlie
A simplified version of Ken's answer:
肯回答的简化版本:
public static BufferedImage rotateClockwise90(BufferedImage src) {
int w = src.getWidth();
int h = src.getHeight();
BufferedImage dest = new BufferedImage(h, w, src.getType());
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
dest.setRGB(y, w - x - 1, src.getRGB(x, y));
return dest;
}
回答by Alexander
We should definitely use Graphics2D if we want to have decent performance (~10x faster comparing to copying pixels directly):
如果我们想要获得不错的性能(比直接复制像素快 10 倍),我们绝对应该使用 Graphics2D:
public static BufferedImage rotateClockwise90(BufferedImage src) {
int width = src.getWidth();
int height = src.getHeight();
BufferedImage dest = new BufferedImage(height, width, src.getType());
Graphics2D graphics2D = dest.createGraphics();
graphics2D.translate((height - width) / 2, (height - width) / 2);
graphics2D.rotate(Math.PI / 2, height / 2, width / 2);
graphics2D.drawRenderedImage(src, null);
return dest;
}
回答by Vikram Singh Shekhawat
Rotate image to 90, 180 or 270 degree angle
将图像旋转到 90、180 或 270 度角
public static BufferedImage rotateImage(BufferedImage src, int rotationAngle) {
double theta = (Math.PI * 2) / 360 * rotationAngle;
int width = src.getWidth();
int height = src.getHeight();
BufferedImage dest;
if (rotationAngle == 90 || rotationAngle == 270) {
dest = new BufferedImage(src.getHeight(), src.getWidth(), src.getType());
} else {
dest = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());
}
Graphics2D graphics2D = dest.createGraphics();
if (rotationAngle == 90) {
graphics2D.translate((height - width) / 2, (height - width) / 2);
graphics2D.rotate(theta, height / 2, width / 2);
} else if (rotationAngle == 270) {
graphics2D.translate((width - height) / 2, (width - height) / 2);
graphics2D.rotate(theta, height / 2, width / 2);
} else {
graphics2D.translate(0, 0);
graphics2D.rotate(theta, width / 2, height / 2);
}
graphics2D.drawRenderedImage(src, null);
return dest;
}
回答by A Pali
here is the code for it using 2D arrays:
这是使用二维数组的代码:
`private static int[][] rorateImage
(int[][] imageArr, int rows, int columns, int flag){
int rotatedImageArr[][] = new int[columns][rows];
if(flag==1){ //90 degree rotation in right
for (int i = 0; i < columns; i++) {
for (int j = 0; j < rows; j++) {
rotatedImageArr[i][j] = imageArr[rows - 1 - j][i];
}
}
}
if(flag==0){ //90 degree rotation in left
for (int i = 0; i < columns; i++) {
for (int j = 0; j < rows; j++) {
rotatedImageArr[i][j] = imageArr[j][columns -1 -i];
}
}
}
return rotatedImageArr;
}`