gpt4 book ai didi

Java BufferedImage 替代品

转载 作者:行者123 更新时间:2023-12-01 19:08:37 32 4
gpt4 key购买 nike

我正在尝试实现一个简单的类,该类允许用户裁剪用于其个人资料图片的图像。这是一个 Java Web 应用程序。

我做了一些搜索,发现 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 或 spring 中,jar 应该很小并且可以轻松部署在 Web 应用程序中

有什么建议吗?

注意:上面关于 bufferedImage 或 Java 存在问题的评论是我在这篇文章中看到的:Guidance on the BufferedImage.getSubimage(int x, int y, int w, int h) method?

最佳答案

我之前曾多次使用 getSubimage() ,没有任何问题。您是否在该调用之前添加了 System.out.println(form.getStartX() + ""+ form.getStartY()) 以确保它们不都是 0?

此外,您是否至少获得了 form.getWidth() x form.getHeight() 的图像?

请确保您没有以任何方式修改/处置 profileImage,因为返回的 BufferedImage 与父级共享相同的数据数组。

如果您想要一个全新且独立的 BufferedImage,最好的方法是简单地将其绘制出来:

BufferedImage croppedImage = new BufferedImage(form.getWidth(),form.getHeight(),BufferedImage.TYPE_INT_ARGB);

Graphics g = croppedImage.getGraphics();
g.drawImage(profileImage,0,0,form.getWidth(),form.getHeight(),form.getStartX(),form.getStartY(),form.getWidth(),form.getHeight(),null);
g.dispose();

关于Java BufferedImage 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9167426/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com