0

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 つの部分に分かれています。

  1. 私は何を間違っていますか?
  2. Javaで画像をスケーリングしてDB(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 に答える