2017-06-19 55 views
0

好吧,所以我有一點搜索,並找不到任何問題,所以希望它不是重複。Java getSubimage()行爲

我有這個程序,只是應該重新排列圖像,使每個角落移動到對面的角落。這裏有一個例證: The Expected Behavior

這裏的Java代碼,我試圖:

 //TL 
     BufferedImage b1 = (b.getSubimage(0, 0, w/2, h/2)); 
     //TR 
     BufferedImage b2 = (b.getSubimage(w/2, 0, w/2, h/2)); 
     //BL 
     BufferedImage b3 = (b.getSubimage(0, h/2, w/2, h/2)); 
     //BR 
     BufferedImage b4 = (b.getSubimage(w/2, h/2, w/2, h/2)); 

     Graphics2D g2d = b.createGraphics(); 

     //New TL 
     g2d.drawImage(b4, 0, 0, null); 
     //New TR 
     g2d.drawImage(b3, w/2, 0, null); 
     //New BL 
     g2d.drawImage(b2, 0, h/2, null); 
     //New BR 
     g2d.drawImage(b1, w/2, h/2, null); 

當b爲我試圖重新排列位圖。此代碼產生以下結果:

The Result I'm getting

我管理通過添加一個額外的行作爲這種修復代碼:

BufferedImage bTest = new BufferedImage(b.getWidth(), b.getHeight(),BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2d = bTest.createGraphics(); 

,然後使用,而不是b BTEST。

所以我想我的問題是,getSubImage實際上做了什麼?從我可以告訴它只是作爲對原始BufferedImage的引用,而不是在調用它時複製它。

我想有一個工作版本,它不需要中間BufferedImage。

如果任何人都可以提供一些幫助,這將不勝感激。謝謝。

+0

我認爲你的第一個子圖像有不正確的寬度和高度參數,你不需要向它們添加x和y –

+0

在這種情況下,x和y都是0,而w和h是整個圖像的寬度和高度。我會修復帖子,謝謝。 –

+0

方法'getSubimage'返回新的'BufferedImage',它使用與原始圖像相同的數據數組ColorModel屬性 –

回答

0

b假設是BufferedImage - 的documentation of getSubimage說:

返回由指定矩形區域定義一個子圖像。返回的BufferedImage 與原始圖像共享相同的數據數組

這意味着,如果你在對面的角落畫一個角落,它也被在以前保存的子圖像繪製

您將需要至少一個臨時像素,更好的臨時角落圖像。恕我直言,最好使用另一個BufferedImage像你一樣(更容易理解)。