我想實現一個簡單的類,將允許用戶裁剪圖像用於他們的個人資料圖片。這是一個java web應用程序。Java BufferedImage的替代
我已經做了一些搜索,發現java.awt有一個BufferedImage類,並且這看起來(乍一看)是完美的,我需要的東西。但是,這似乎有一個錯誤(或者,正如我所看到的那樣,也許是java),這意味着裁剪並不總是正常工作。
這裏是我使用的嘗試裁剪我的形象代碼:
BufferedImage profileImage = getProfileImage(form, modelMap);
if (profileImage != null) {
BufferedImage croppedImage = profileImage
.getSubimage(form.getStartX(), form.getStartY(), form.getWidth(), form.getHeight());
System.err.println(form.getStartX());
System.err.println(form.getStartY());
File finalProfileImage = new File(form.getProfileImage());
try {
String imageType = getImageType(form.getProfileImage());
ImageIO.write(croppedImage, imageType, finalProfileImage);
}
catch (Exception e) {
logger.error("Unable to write cropped image", e);
}
}
return modelAndView;
}
protected BufferedImage getProfileImage(CropImageForm form, Map<String, Object> modelMap) {
String profileImageFileName = form.getProfileImage();
if (validImage(profileImageFileName) && imageExists(profileImageFileName)) {
BufferedImage image = null;
try {
image = getCroppableImage(form, ImageIO.read(new File(profileImageFileName)), modelMap);
}
catch (IOException e) {
logger.error("Unable to crop image, could not read profile image: [" + profileImageFileName + "]");
modelMap.put("errorMessage", "Unable to crop image. Please try again");
return null;
}
return image;
}
modelMap.put("errorMessage", "Unable to crop image. Please try again.");
return null;
}
private boolean imageExists(String profileImageFileName) {
return new File(profileImageFileName).exists();
}
private BufferedImage getCroppableImage(CropImageForm form, BufferedImage image, Map<String, Object> modelMap) {
int cropHeight = form.getHeight();
int cropWidth = form.getWidth();
if (cropHeight <= image.getHeight() && cropWidth <= image.getWidth()) {
return image;
}
modelMap.put("errorMessage", "Unable to crop image. Crop size larger than image.");
return null;
}
private boolean validImage(String profileImageFileName) {
String extension = getImageType(profileImageFileName);
return (extension.equals("jpg") || extension.equals("gif") || extension.equals("png"));
}
private String getImageType(String profileImageFileName) {
int indexOfSeparator = profileImageFileName.lastIndexOf(".");
return profileImageFileName.substring(indexOfSeparator + 1);
}
的形式在此代碼段稱爲是一個簡單的POJO其中包含左上角的整數值開始種植( startX和startY)以及製作新圖像的寬度和高度。
然而,我最終得到的是一個裁剪後的圖像,始終從0,0開始,而不是startX和startY的位置。我檢查了代碼以確保正確的值被傳遞給getSubimage方法,並且它們似乎是。
是否有簡單的替代方法來使用BufferedImage剪裁圖像。我簡單看了一下JAI。我寧願將jar添加到我的應用程序中,而不是更新所有生產框中安裝的jdk以及任何開發/測試服務器和本地工作站。
我給選擇替代的標準是: 1)使用簡單裁剪圖像,因爲這是所有我將使用它的 2)如果沒有內置java或彈簧,將該罐應該是小的和容易可部署在網絡應用程序中
有什麼建議嗎?
注:以上的評論沒有與BufferedImage的或Java是什麼的問題,我在此張貼看到:Guidance on the BufferedImage.getSubimage(int x, int y, int w, int h) method?
我以前用過'getSubImage(...)'以前沒有問題。也許我們應該首先確定錯誤是在Java而不是你的代碼之前,試圖找到一些深奧的選擇。考慮創建併發佈一個最小的可編譯和可運行的程序,用於演示您的問題,但沒有代碼與問題無關,即[sscce](http://sscce.org)。 – 2012-02-06 21:29:16
我已經添加了獲取圖像和裁剪的代碼。我遺漏了表單對象,正如我上面所說的,它只是一個POJO,它具有文件名和裁剪的座標。 – 2012-02-06 21:59:08
感謝您的代碼發佈,並希望這將足以讓人們檢查並給你一個體面的解決方案。如果不是,請再次考慮創建併發布[sscce](http://sscce.org)。 Aagin,沒有人希望看到你的其他代碼(謝謝你沒有發佈它),但一個小的可編譯的測試程序,顯示上述方法的問題將是一個很大的幫助。 – 2012-02-06 22:57:58