Я пытаюсь реализовать простой класс, который позволит пользователю обрезать изображение, которое будет использоваться для его изображения профиля.Это веб-приложение на Java.
Я провел некоторый поиск и обнаружил, что java.awt имеет класс BufferedImage, и это (на первый взгляд) кажется идеальным для того, что мне нужно.Тем не менее, кажется, что в этом есть ошибка (или, возможно, Java, как я видел, предположил), что означает, что обрезка не всегда работает правильно.
Вот код, который я использую, чтобы попытаться обрезатьmy image:
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), а также ширину и высоту для создания новогоimage.
Однако я получаю обрезанное изображение, которое всегда начинается с 0,0, а не с позиции startX и startY.Я проверил код, чтобы убедиться, что в метод getSubimage передаются правильные значения, и они выглядят так:
Существуют ли простые альтернативы использованию BufferedImage для обрезки изображения.Я кратко посмотрел на JAI.Я предпочел бы добавить jar в свое приложение, чем обновлять jdk, установленный на всех производственных блоках, а также на любых серверах разработки / тестирования и локальных рабочих станциях.
Мои критерии выбора альтернативы: 1) простойиспользовать, чтобы обрезать изображение, так как это все, что я буду использовать для 2) если оно не встроено в java или spring, баночка должна быть небольшой и легко развертываемой в веб-приложении
Есть предложения?
Примечание: комментарий выше о том, что есть проблема с bufferedImage или Java, был тем, что я видел в этой публикации: Руководство по методу BufferedImage.getSubimage (int x, int y, int w, int h) метод?