imgScalr Image Scaling ライブラリを使い始めたところです。
画像をスケーリングするためのコードを取得できます (これが機能すると確信しています)。
BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);
バックストーリー
これは tomcat6 webapp で使用されます。イメージをサーブレットに渡し、「imageStream」という名前の InputStream に読み込みます。
画像のサイズ変更/スケーリングの前に、私が行っていたのは、その InputStream を取得し、次のようにBlob
を使用して 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
質問
質問は 2 つの部分に分かれています。
- 私は何を間違っていますか?
- Javaで画像をスケーリングしてDB(Blob)フィールドに保存するより良い方法はありますか?