2012-03-17 1 views
5

JPG 파일을 90도 회전하려고합니다. 그러나 내 코드 출력 이미지 (BufferedImage)는 완전히 검은 색입니다.AffineTransform을 사용한 Java 이미지 회전은 검정색 이미지를 출력하지만 크기가 조정되면 제대로 작동합니다.

private static BufferedImage transform(BufferedImage originalImage) { 
    BufferedImage newImage = null; 
    AffineTransform tx = new AffineTransform(); 
    tx.rotate(Math.PI/2, originalImage.getWidth()/2, originalImage.getHeight()/2); 

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); 
    newImage = op.filter(originalImage, newImage); 

    return newImage; 
} 

public static void main(String[] args) throws Exception { 
    BufferedImage bi = transform(ImageIO.read(new File(
      "3.jpg"))); 
    ImageIO.write(bi, "jpg", new File("out.jpg")); 

} 

여기 무슨 일이야 (다운로드 here 3.JPG) :

여기에 재현 할 수있는 방법이있다? 이 생성시키기보다는 필터() 메소드에 새로운 BufferedImage를 전달

(나는 이미지 크기 변경 라이브러리에이 검은 색 출력 BufferedImage을 줄 경우, 그것은 원래의 이미지가 여전히 잘 크기가 조정됩니다.)

답변

13

의 자신의 작품 (완전히 검은 색이 아님).

또한 변환이 올바르게 작동하지 않는 것처럼 보였습니다. 이미지가 목적지에서 오프셋되었습니다. 수동으로 필요한 번역을 적용하고 역순으로이 작업을 기록하고 대상 이미지에서 너비 = 이전 높이 및 높이 = 이전 너비로 수정했습니다.

AffineTransform tx = new AffineTransform(); 

// last, width = height and height = width :) 
tx.translate(originalImage.getHeight()/2,originalImage.getWidth()/2); 
tx.rotate(Math.PI/2); 
// first - center image at the origin so rotate works OK 
tx.translate(-originalImage.getWidth()/2,-originalImage.getHeight()/2); 

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 

// new destination image where height = width and width = height. 
BufferedImage newImage =new BufferedImage(originalImage.getHeight(), originalImage.getWidth(), originalImage.getType()); 
op.filter(originalImage, newImage); 

필터의 자바 독()

그것이 내가 여전히 문제가 해결되지 않는 이유를 확실 해요, 당신을 위해 BufferedImage를 만들 것을 주장한다, 여기에 문제가있을 수 있어야합니다.

If the destination image is null, a BufferedImage is created with the source ColorModel. 
5

당신은 제 3 자 LIB (아주 작은, 단 2 클래스) 주변의 모든 필터 개는 작업하는 동안 imgscalr는 한 줄에 당신을 위해이 작업을 수행 할 수 있습니다를 사용하는 아이디어에 열려 있던 경우 서로 다른 이미지 형식 수 원인.

같은 것을 보일 것이다 Scalr.rotate(...) 사용 : 당신이 (AsyncScalr class)하는 것이 필요한 경우이 회전 이미지를 처리하는 더 큰 응용 프로그램의 일부입니다

BufferedImage newImage = Scalr.rotate(originalImage, Rotation.CW_90); 

경우, 당신도 비동기 적으로이 작업을 수행 할 수 있습니다.

imgscalr은 Apache 2 라이센스하에 있으며 모든 소스를 사용할 수 있습니다. code for the rotate() method을 통해 읽어 보시고, Java2D의 필터로 작업 할 때 발생할 수있는 모든 문제를 문서화했습니다.

희망 하시겠습니까?