2013-04-06 25 views
3

我有一個尺寸爲16x6080的圖像。這是一個堆疊的圖像,其中包含16x16部分的國旗。我的目標是僅從該圖像中提取特定的國家/地區標誌並將其保存爲自己的文件。這裏是我當前的代碼使用java裁剪圖像的問題image.getSubimage

  //Original Image 
     BufferedImage image = ImageIO.read(new File(countryImageNamePath)); 

     System.out.println("Original Image Dimension: "+image.getWidth()+"x"+image.getHeight()); 

     //Get the cropped image 
     BufferedImage out = image.getSubimage(0, 1808, 16, 16); 

     //Create a file to stream the out buffered image to 
     File croppedFile = new File(countryImagePath + countryName + ".gif"); 

     //Write the cropped file 
     ImageIO.write(out, "gif", croppedFile); 

產生的輸出是

Original Image Dimension: 16x6080 
Write File : C:\Applications\WorldCoinParser\images\country\US.gif 

不要緊,我輸入什麼值的Y座標我總是起點爲x = 0的圖像的頂部和y = 0,寬度和高度爲16.

有沒有人看到我在搞什麼?

謝謝!

+0

我看不出有什麼明顯的錯誤與您的代碼段工程。考慮創建併發布[sscce](http://sscce.org),它使用所有人都可以使用的在線圖像。 – 2013-04-06 17:46:51

+1

原來,這是一個Java 6(及更低版本)內部試圖解析gif文件的錯誤。升級到Java7解決了這個問題。 – 2013-04-06 18:40:45

+2

好吧,我的按鈕,沒有開玩笑嗎?感謝您回覆我們。考慮發佈這個作爲你的問題的答案。 – 2013-04-06 18:41:43

回答

0

正如@MattPerry說,我們可以解決這個問題剛剛升級到Java 7中

只是爲了文檔的目的,錯誤似乎是這樣的一個http://bugs.sun.com/view_bug.do?bug_id=6795544和受影響的Java 6

The reason of problem here is that the optimized writing loop (utilized 
direct access to image data buffer) does not take into account a data 
band offset (which is non-trivial for sub-images, for example). It results 
in writing image data starting from top left corner of the parent image 
instead of expected top left corner of the sub-image. 

We should take into account data bands offset, calculated by translated 
raster instance. 

我可以使用JDK5

重現此錯誤,它JDK7