2011-05-05 4 views
1

간단한 프로그램을 만들고 싶습니다. 여기서 간단한 png를 캔버스에 추가 할 수 있습니다. 옵션 중 하나는 선택한 PNG를 회전하는 것입니다. 나는 회전 문제가있다. 변환을 사용할 때 모든 것을 캔버스에 회전시킵니다. 저는 90 '또는 뒤집기에 의한 회전 예제 만 만들었지 만 어떤 각도로든 회전하고 싶습니다.java swt image (imagedata) rotate

나는 또한 swed 이미지를 bufferedimage로 변환하려고 시도했는데, bufferedimage를 swt 이미지로 변환하고 그릴 수는 있지만 매우 느리고 투명성에 문제가있다.

나는 도움을 주셔서 감사합니다. 이미지 중심을 통해 회전하고 싶습니다. drawig에 대해 저는 GC와 Canvas를 사용하고 있습니다 - 새로운 GC (캔버스);


편집 : 내가 STIL 이미지의 중심으로 회전 문제가 :

gc.setAdvanced(true); 
     if (!gc.getAdvanced()) { 
      gc.drawText("Advanced graphics not supported", 30, 30, true); 
      return; 
     } 

     Transform oldTransform = new Transform(gc.getDevice()); 
     gc.getTransform(oldTransform); 

     Transform transform = new Transform(GCController.getCanvas().getDisplay()); 
     transform.translate(width/2, height/2); 
     transform.rotate(rotation); 
     gc.setTransform(transform); 
     gc.drawImage(image, x, y); 

     gc.setTransform(oldTransform); 

     transform.dispose(); 

답변

4

당신은 매트릭스 변환을 사용해야합니다. this SWT 스 니펫을 확인하십시오. 참고로 나는 15도를 예제로 보여 주었다.

import org.eclipse.swt.*; 
import org.eclipse.swt.events.*; 
import org.eclipse.swt.graphics.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 

public class ImageTest {  
    public static void main(String[] args) { 
     final Display display = new Display(); 

     final Image image = new Image(display,"next.png"); 


     final Rectangle rect = image.getBounds(); 
     Shell shell = new Shell(display); 
     shell.setText("Matrix Tranformations"); 
     shell.setLayout(new FillLayout()); 
     final Canvas canvas = new Canvas(shell, SWT.DOUBLE_BUFFERED); 
     canvas.addPaintListener(new PaintListener() { 
      public void paintControl(PaintEvent e) {  
       GC gc = e.gc; 
       gc.setAdvanced(true); 
       if (!gc.getAdvanced()){ 
        gc.drawText("Advanced graphics not supported", 30, 30, true); 
        return; 
       } 

       // Original image 
       int x = 30, y = 30; 
       gc.drawImage(image, x, y); 
       x += rect.width + 30; 

       Transform transform = new Transform(display); 

       // Note that the tranform is applied to the whole GC therefore 
       // the coordinates need to be adjusted too. 

       // Reflect around the y axis. 
       transform.setElements(-1, 0, 0, 1, 0 ,0); 
       gc.setTransform(transform); 
       gc.drawImage(image, -1*x-rect.width, y); 



       // Rotate by 45 degrees 
       float cos45 = (float)Math.cos(Math.PI/4); 
       float sin45 = (float)Math.sin(Math.PI/4); 
       transform.setElements(cos45, sin45, -sin45, cos45, 0, 0); 
       gc.setTransform(transform); 
       gc.drawImage(image, x , y); 

       float cos15 = (float)Math.cos(Math.PI/12); 
       float sin15 = (float)Math.sin(Math.PI/12); 
       transform.setElements(cos15, sin15, -sin15, cos15, 0, 0); 
       gc.setTransform(transform); 
       gc.drawImage(image, x+rect.width/2 , y+rect.height/2); 

       transform.dispose(); 
      } 
     }); 

     shell.setSize(350, 550); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     image.dispose(); 
     display.dispose(); 
    } 
} 

>> 출력

enter image description here

1

확인. 나는 그것을 해결했다.

gc.setAdvanced(true); 
     if (!gc.getAdvanced()) { 
      gc.drawText("Advanced graphics not supported", 30, 30, true); 
      return; 
     } 

     Transform oldTransform = new Transform(gc.getDevice()); 
     gc.getTransform(oldTransform); 

     Transform transform = new Transform(GCController.getCanvas().getDisplay()); 
     transform.translate(x+width/2, y+height/2); 
     transform.rotate(rotation); 
     transform.translate(-x-width/2, -y-height/2); 

     gc.setTransform(transform); 
     gc.drawImage(image, x, y);   
     gc.setTransform(oldTransform); 

     transform.dispose(); 

문제는 잘못된 번역이었습니다.

첫 번째 번역 :

transform.translate(x+width/2, y+height/2); 

다음 회전과 두 번째 번역 :

그래서 일단 나는 너비와 길이와 회전 이후의 x와 y 위치 플러스 절반은 다시 이전 위치로의에 의해 내 모양을 번역했다
transform.translate(-x-width/2, -y-height/2);