2014-01-06 61 views
1

我無法將圖像向右旋轉90度。 我需要能夠在java中分別旋轉圖像。唯一的事情。不幸的是,我需要在特定的點上繪製圖像,並且沒有任何方法可以使圖像單獨旋轉,並且允許我設置x和y。任何幫助理解在Java中向右旋轉90度圖像

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 
    } 
+1

[我相信這是你想要什麼] [1] [1]:http://stackoverflow.com/問題/ 4156518 /在Java中旋轉圖像 –

回答

2

這裏是我用來順時針旋轉90度BufferedImage的代碼。由於旋轉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; 
} 
+0

我得到了轉換錯誤(DataBufferInt而不是DataBufferByte)和數組索引錯誤。我只是改變了使用setRGB和getRGB,它現在可以正常工作。謝謝! – Charlie

1

的簡化版本肯的回答:

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,x,src.getRGB(x,y)); 
    return dest; 
}