2012-01-25 2 views
0

Java에서로드 된 png를 회전하려고합니다. 내가 가진 문제는 이미지를 회전시킬 때 이미지의 위치를 ​​엉망으로 만드는 것입니다. 회전하는 것이 이미지를 움직이지 않는다고 가정 할 수 있도록 60x60 이미지를 회전시키고 있습니다. 이미지를 움직이지 않고 이미지를 회전시킬 수있는 방법이 있습니까? 아니면 아핀 변환의 좌표를 설정하는 방법입니까?Java에서 png 순환

 AffineTransform identity = new AffineTransform(); 
     gr.setColor(Color.red); 

     gr.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 

     AffineTransform trans = new AffineTransform(); 
     trans.setTransform(identity); 
     trans.rotate(-Math.toRadians(15)); 
     trans.translate(-25, 220); 

     gr.drawImage(body.getImage(), 0, 200, null); 
     gr.drawImage(gun.getImage(), trans, this); 
+0

당신이'.translate()를 호출하는 것이 목적입니까? – medopal

+0

이미지를 원래 위치로 되돌리려 고하는데이 작업을하고 있지만 회전 정도에 따라 양이 바뀝니다. –

답변

4

AffineTransformconcatenate(AffineTransform) 인스턴스 사용 (가산) 연결될 수있다. 이미지를 회전시키는 일반적인 방법은 다음과 같습니다.


사실, 그 는 앵커 포인트를 중심으로 회전 좌표 변환을 반환

  • getRotateInstance(double theta, double anchorx, double anchory)
    위한 방법으로 보인다.이 작업은 고정 점이 원점 (S1)에있는 좌표를 변환 한 다음 새 원점 (S2)을 중심으로 회전하고 마지막으로 중간 원점이 원래 앵커의 좌표로 복원되도록 좌표를 변환하는 것과 같습니다 포인트 (S3).
  • getRotateInstance(double vecx, double vecy, double anchorx, double anchory)
    앵커 포인트이 회전 벡터와 일치하도록 좌표를 회전하는 변환을 반환합니다. 모든 좌표는 지정된 양 좌표만큼 동일한 양만큼 회전합니다. 회전 양은 이전 양의 X 축의 좌표가 이후 원점에서 지정된 벡터 좌표를 가리키는 벡터와 정렬되도록합니다. vecx 및 vecy가 모두 0.0 인 경우 항등 변환이 반환됩니다. 이 작업은 다음을 호출하는 것과 같습니다. ...

나를 RTM으로 알려준 Donal Fellows에게 감사드립니다.

+2

anchorx/y 인수를 사용하는 메서드는 실제로 정확히 같습니다. –

+0

@DonalFellows 정보를 추가했습니다. 대답에. 명확히 해 주셔서 감사합니다. –

1

회전과 관련하여 다소 복잡한 문제가 발생했습니다. 90도 회전하는 것이 가장 문제가되었습니다.

이 문제를 올바르게 처리하는 API가 있으며 imgscalr입니다.

코드 :

BufferedImage rotatedPhoto = Scalr.rotate(photo, Scalr.Rotation.CW_90, null); 

가 잘 할 것, 표준 java.awt의 스케일링 및 번역에 대한 imgscalr 사용하지 않았다.

이 때문에 새로운 이미지 사진이 만들어집니다. var.flush()를 사용하여 이전 버전을 플러시/무효화하십시오.

건배