【发布时间】:2014-12-22 23:47:07
【问题描述】:
我刚刚开始使用imgScalr Image Scaling 库。
我可以获得缩放图像的代码(我很确定这可行)。
BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);
背景故事
这在 tomcat6 webapp 中使用。我将图像传递给一个 servlet,并将其读入一个名为“imageStream”的 InputStream。
在调整图像大小/缩放图像之前,我所做的是获取 InputStream 并使用 PreparedStatement 将其保存到 DB (Oracle11+) Blob 字段,如下所示:
PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, imageStream);
这很好,因为我可以毫无问题地保存它并毫无问题地检索它。
问题
现在的问题是我正在缩放它们正在转换为
BufferedImage 的图像,我无法使用PreparedStatement 直接将其保存到数据库中。
相反,我正在尝试将BufferedImage 转换为ByteArrayOutputStream,然后将其读入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
问题
问题分为两部分:
- 我做错了什么?
- 有没有更好的方法在 java 中缩放图像并将其保存到 DB (Blob) 字段?
【问题讨论】:
-
尝试在
ImageIO.write(thumbImage, imageMim....)之后调用fullImageArray.close()和thumbImageArray.close()。我的猜测:输出流没有被刷新,因此输入流没有数据。您应该检查fullImageArray.toByteArray().length是什么,拇指图像也是如此。 -
@ug_ 两者都有'.close()',但没有区别(两个数组的长度都是0,在'close'之前和之后)。
-
不确定这是否有帮助,但我在 jre7 上。
-
您是否检查过图像的大小调整是否正确?例如检查宽度和高度是否 > 0。或者可能设置一个使用 Scalr 库从文件中获取图像的小应用程序,重新调整大小并保存。
-
@ug_ 是的,两个图像的大小都正确调整... fullImage:宽度 = 450 高度 = 450,拇指图像:宽度 = 150 高度 = 150。正如您指出的那样,@ 987654339@ 被写入
ByteArrayOutputStream。由于某种原因,数据丢失了。