我刚刚开始使用imgScalr图像缩放库。
我可以获得缩放图像的代码(我很确定这可行)。
BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);
背景故事
这在 tomcat6 webapp 中使用。我将图像传递给一个 servlet,并将其读入一个名为“imageStream”的 InputStream。
在调整图像大小/缩放图像之前,我正在做的是使用 InputStream 并将其保存到 DB (Oracle11+)Blob
字段中PreparedStatement
,如下所示:
PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, imageStream);
这工作正常,因为我可以毫无问题地保存它并毫无问题地检索它。
问题
现在的问题是我正在缩放它们正在转换的图像
BufferedImage
,我无法使用我的PreparedStatement
.
相反,我要做的是将 a 转换BufferedImage
为 a ByteArrayOutputStream
,然后将其读入 a 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 中的图像并将其保存到数据库(Blob)字段?