0

我刚刚开始使用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


问题
问题分为两部分:

  1. 我究竟做错了什么?
  2. 有没有更好的方法来缩放 Java 中的图像并将其保存到数据库(Blob)字段?
4

1 回答 1

1

这个问题是由众所周知的Pebcak问题引起的,或者在这种情况下是“开发人员错误”!

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

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

" imageMimeType" 是完整的 mime 类型,所以在这种情况下它是 "image/jpg"。这是不正确的,因为该值应该只是ImageIO.write()方法所期望的“jpg”。

固定的:
ImageIO.write(fullImage, imageMimeType.replace("image/", ""), fullImageArray);

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

于 2014-12-23T01:13:15.997 回答