2011-04-10 4 views
2

나는 이미지를 뒤집을 필요가있는 타일 게임을 만들고 있습니다.이미지 뒤집기

public Image getMirrorImage(Image image) { 
    return getScaledImage(image, -1, 1); 
} 

private Image getScaledImage(Image image, float x, float y) { 
    // set up the transform 
    AffineTransform transform = new AffineTransform(); 
    transform.scale(x, y); 
    transform.translate(
     (x-1) * image.getWidth(null)/2, 
     (y-1) * image.getHeight(null)/2); 

    // create a transparent (not translucent) image 
    Image newImage = gc.createCompatibleImage(
     image.getWidth(null), 
     image.getHeight(null), 
     Transparency.BITMASK); 

    // draw the transformed image 
    Graphics2D g = (Graphics2D)newImage.getGraphics(); 
    g.drawImage(image, transform, null); 
    g.dispose(); 

    return newImage; 
} 

이 사람이 나에게 설명 할 수 내가 수도 : 여기

Image newImage = gc.createCompatibleImage(
     image.getWidth(null), 
     image.getHeight(null), 
     Transparency.BITMASK); 

내가 가지고있는 코드입니다 :이 라인에서

Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0 

: 코드로 나는이 오류를 생산하고 있습니다 다른 일을해야하거나 어떻게 작동시킬 수 있습니까? 많은 감사

+0

스케일을 -1로 설정하는 대신 -1로 시도해보십시오. –

+0

더 나은 도움을 받으려면 [SSCCE] (http://pscode.org/sscce.html)를 게시하십시오. –

답변

3

image.getWidth(null)image.getHeight(null)은 아직 알 수없는 경우 -1을 반환 할 수 있습니다. 이미지 처리는 동시에 수행 할 수 있으며 해당 메소드를 호출하려고 시도 할 때 계속 진행될 수 있습니다 (로컬로도이 IIRC를 수행합니다). 다음은 그 폭과 높이에 액세스를 시도하기 전에 이미지를 기다려야하기 전에 사용했던 코드의 조각을로드 할 수있다 :

private void waitForImage(Image image) { 
    Container container = new Container(); 
    MediaTracker tracker = new MediaTracker(container); 
    tracker.addImage(image, 0); 
    try { 
     tracker.waitForID(0, 1000); 
    } catch (Exception e) { 
    } 
} 

난 그냥 로컬 테스트를 시도하고 대기 시간이 몇 가지 작은을 위해 일반적으로이 1ms했다 이미지. 실제로 추가 시간이 아니라 마지막 단계가 완료 될 때까지 코드가 폭과 높이를 얻도록 기다리는 것입니다.

+2

그 중 하나 또는'ImageIO.read (File/URL/InputStream)'을 사용하여로드 될 때까지 차단합니다. –

+0

귀하의 게시물을 주셔서 감사합니다, 당신은 오류가 발생하지 않도록 내 프로그램에 그것을 encorporate하는 방법의 예를 들어 줄 수 있습니까? – mimis40

+0

@Andrew : 오 그래, 바로 그게 더 현대적인 방법입니다. 나는 애플릿에서 10 년 전의 이미지 스케일링을 생각 나게 했으므로, 먼저 어떤 이유로 든 그것을 참조했다. :) – WhiteFang34

0

이미지를 뒤집기위한 가장 쉬운 방법은 이미지를 음수로 조정하는 것입니다. 예 :

g2.drawImage(image, x, y, -width, height, null); 

이렇게하면 수직으로 뒤집습니다. 그러면 가로로 뒤집을 수 있습니다.

g2.drawImage(image, x, y, width, -height, null);