缩放图像,然后保存到DB(Blob)

时间:2014-12-22 23:47:07

标签: java image jdbc imgscalr

我刚开始使用imgScalr Image Scaling库。

我可以获取缩放图像的代码(我非常确定这有效)。

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

<小时/> 的背景故事
这用于tomcat6 webapp。我将图像传递给servlet,然后将其读入名为&#34; imageStream&#34;的输入流中。

在调整图像大小/缩放之前,我正在做的是使用Blob将该InputStream保存到DB(Oracle11 +) PreparedStatement 字段,就像这样:

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值,因此不是问题。

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

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

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

1 个答案:

答案 0 :(得分:1)

此问题是由Pebcak的常见问题引起的,或者在这种情况下&#34;开发人员错误&#34;!

为了将来参考,我错误的是我使用了ImageIO.read方法的错误图像类型:

<强>有问题的:
ImageIO.write(fullImage, imageMimeType, fullImageArray);

&#34; imageMimeType&#34;是完整的哑剧类型,所以在这种情况下它是&#34; image / jpg&#34;。这是不正确的,因为该值应该只是&#34; jpg&#34;这是ImageIO.write()方法所期待的。

<强>固定
ImageIO.write(fullImage, imageMimeType.replace("image/", ""), fullImageArray);

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