2011-03-03 56 views
18

我試着做下面的代碼:如何在Java中裁剪一些圖像區域?

private void crop(HttpServletRequest request, HttpServletResponse response){ 
    int x = 100; 
    int y = 100; 
    int w = 3264; 
    int h = 2448; 

    String path = "D:images\\upload_final\\030311175258.jpg"; 

    BufferedImage image = ImageIO.read(new File(path)); 
    BufferedImage out = image.getSubimage(x, y, w, h); 

    ImageIO.write(out, "jpg", new File(path)); 

} 

但一直給我同樣的錯誤:

java.awt.image.RasterFormatException: (x + width) is outside of Raster 
sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1230) 
    java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1156) 

哪裏是我的錯?

回答

29

我最初的猜測是你的(x + w) > image.getWidth()

如果您打印出image.getWidth(),它是3264嗎? :o

你當前做的是這樣的:

<-- 3264 ------> 
+--------------+ 
| orig  | +-- Causing the problem 
|    | V 
| +--------------+ 
|100| overlap | | 
| |   | | 
| |   | | 
+---|----------+ | 
    |    | 
    | out  | 
    +--------------+ 

如果你想剪掉原稿的右上角,和剛剛獲得「重疊」,那麼你需要做的

BufferedImage out = image.getSubimage(x, y, w-x, h-y); 

如果你想做到這一點:

+------------------+ 
|     | 
| +-----------+ | 
| |   | | 
| |   | | 
| |   | | 
| |   | | 
| +-----------+ | 
|     | 
+------------------+ 

然後,你需要這樣做:

BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y); 
+1

嗨夥計,這是。 – 2011-03-03 21:16:46

+0

@Valter更新後的答案使其更清楚我們正在做什麼。 – corsiKa 2011-03-03 21:17:26

+0

非常感謝你@glowcoder完美的作品我是第二種方法=) – 2011-03-03 21:28:14

4

對於那些只想在您的軟件中進行裁剪和其他基本圖像處理功能的用戶,我建議使用圖像處理庫。通常這些實現是優化和穩定的。

一些Java圖像處理庫:ImageJMarvinJMagickJIUJH Labsimgscalr

另一個優點是讓事情變得簡單。只需幾行代碼就可以完成很多工作。在下面的例子中,我使用Marvin Framework進行裁剪。

原文:
enter image description here

七分褲:
enter image description here

來源:

MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg"); 
crop(image.clone(), image, 60, 32, 182, 62); 
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg"); 
+0

裁剪是一行代碼你在說什麼?當然你必須促進你的圖書館 – gpasch 2016-12-08 15:32:50

+0

@gpasch對不起如果我不清楚我的觀點。當我推薦使用庫時,通常與圖像處理相關,而不是僅考慮裁剪。許多開發人員來這裏尋找解決方案。我建議使用庫,而不是複製和粘貼方法。裁剪只是一條線,但使用默認的Java API時,調整大小,旋轉等等要複雜得多。我列舉了6個框架。當然,我在我的例子中使用了馬文,因爲它是我幫助開發的一個,我更熟悉。如果其他人在我的解釋後看到您的問題,我會自己刪除答案。 – 2016-12-08 16:21:37