我刚开始使用imgScalr Image Scaling库。
我可以获取缩放图像的代码(我非常确定这有效)。
BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);
<小时/> 的背景故事
在调整图像大小/缩放之前,我正在做的是使用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}}
<小时/> 问题
答案 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
在这种情况下是安全的,因为字符串将始终遵循该模式。