簡體   English   中英

在java中向右旋轉90度

[英]Rotate 90 degree to right image in java

我無法將圖像向右旋轉90度。 我需要能夠在java中單獨旋轉圖像。 唯一的事情。 不幸的是,我需要在特定的點繪制圖像,並且沒有一個方法可以分別對圖像進行旋轉,並且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
    }

如果我們想要具有不錯的性能(與直接復制像素相比快~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;
}

這是我用來順時針旋轉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;
}

Ken答案的簡化版本:

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;
}

作為討論在這里 ,你可以使用AffineTransformOp旋轉由圖像Math.PI / 2 ; 這相當於對圖像進行順時針旋轉90°,如圖所示在這里 另請參閱處理90度旋轉

將圖像旋轉到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;
}

這是使用2D數組的代碼:

  `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;
}`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM