2011-04-10 190 views
2

我正在創建一個需要翻轉圖像的平鋪遊戲。隨着代碼我有它產生這個錯誤:從該行翻轉圖像

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

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

這裏是編碼我有:

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; 
} 

誰能向我解釋什麼,我可能需要做不同的事情,或者我可以如何讓它工作?非常感謝

+0

嘗試將比例乘以-1而不是將其設置爲-1。 – 2011-04-10 23:16:38

+0

爲了更快地獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。 – 2011-04-10 23:28:26

回答

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)'阻塞,直到加載。 – 2011-04-10 23:29:21

+0

非常感謝您的留言,您能舉一個例子來說明如何將它整合到我的程序中,所以我不知道錯誤嗎? – mimis40 2011-04-10 23:34:57

+0

@Andrew:哦,是的,這是正確的,有一個更現代的方式來做到這一點。我想起了我十年前在一個applet中做過的一些圖像縮放,所以我首先引用了它,因爲某種原因:) – WhiteFang34 2011-04-10 23:36:39

0

翻轉圖像的最簡單方法是對其進行負面縮放。例如:

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

這會垂直翻轉它。這會將其水平翻轉:

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