gpt4 book ai didi

java - 缩放图像,然后保存到数据库(Blob)

转载 作者:行者123 更新时间:2023-12-01 12:05:50 25 4
gpt4 key购买 nike

我刚刚开始使用 imgScalr图像缩放库。

我可以获得缩放图像的代码(我很确定这有效)。

BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);

<小时/> 背景故事
这是在 tomcat6 web 应用程序中使用的。我将图像传递到 servlet,并将其读入名为“imageStream”的输入流中。

在调整图像大小/缩放图像之前,我所做的是获取该InputStream并将其保存到数据库(Oracle11+) Blob 字段使用 PreparedStatement ,像这样:

PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, imageStream);

这工作正常,因为我可以毫无问题地保存它并毫无问题地检索它。

<小时/> 问题
现在的问题是我正在缩放图像,它们正在转换为 BufferedImage我无法使用我的 PreparedStatement 直接保存到数据库.

相反,我想做的是转换 BufferedImageByteArrayOutputStream然后被读入 InputStream ,参见下面的代码:

BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);

ByteArrayOutputStream fullImageArray = new ByteArrayOutputStream();
ByteArrayOutputStream thumbImageArray = new ByteArrayOutputStream();

ImageIO.write(fullImage, imageMimeType, fullImageArray);
ImageIO.write(thumbImage, imageMimeType, thumbImageArray);

InputStream fullImageStream = new ByteArrayInputStream(fullImageArray.toByteArray());
InputStream thumbImageStream = new ByteArrayInputStream(thumbImageArray.toByteArray());

// DB INITIALISATION STUFF

PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, fullImageStream);
st.setBlob(2, thumbImageStream);

<小时/> 错误详细信息
当我执行该语句时,我得到 java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into 。我知道这显然意味着我正在尝试插入 NULL值放入列中,所以这不是问题。

问题是,在转换或缩放过程中的某个时刻,图像值会丢失,最终得到 null

<小时/> 问题
问题分为两部分:

  1. 我做错了什么?
  2. 是否有更好的方法在 java 中缩放图像并将其保存到 DB (Blob) 字段?

最佳答案

此问题是由众所周知的问题 Pebcak 引起的,或者在本例中为“开发人员错误”!

为了将来的引用,我做错的是我在 ImageIO.read 方法中使用了不正确的图像类型:

有问题:
ImageIO.write(fullImage, imageMimeType, fullImageArray);

imageMimeType”是完整的 mime 类型,因此在本例中它是“image/jpg”。这是不正确的,因为该值应该只是“jpg”,这就是ImageIO.write()方法正在等待。

已修复:
ImageIO.write(fullImage, imageMimeType.replace("image/", ""), fullImageArray);

我知道在这种情况下替换是安全的,因为字符串将始终遵循该模式。

关于java - 缩放图像,然后保存到数据库(Blob),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612183/

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