2014-01-06 4 views
1

Не могу повернуть изображение 90 градусов вправо. Мне нужно иметь возможность поочередно поворачивать изображения в java. Единственная вещь. К сожалению, мне нужно нарисовать изображение в определенной точке, и нет никакого метода с аргументом, который 1. Обобщает изображение отдельно и 2. позволяет установить x и y. любая помощь приветствуетсяПовернуть поворот на 90 градусов вправо в java

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/rotate-an-image-in-java –

ответ

2

Как обсуждалось here, вы можете использовать AffineTransformOp, чтобы повернуть изображение по Math.PI/2; это эквивалентно вращению изображения по часовой стрелке на 90 °. См. Также Handling 90-Degree Rotations.

2

Код, используемый для вращения BufferedImage по часовой стрелке на 90 градусов. Поскольку поворот на 90 градусов является особым случаем, я не думал, что решение, которое было бы общим для любого угла, было бы оптимальным. Аналогично для решений, которые выполняют некоторую интерполяцию (билинейный, бикубический и т. Д.), Я использовал BufferedImage.getRaster() для доступа к необработанным байтам для повышения производительности, но в зависимости от структуры/компоновки изображения это маловероятно работать во всех случаях. YMMV.

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; 
} 
Смежные вопросы