0

サーブレット応答としてストリーミングする必要があるjpegのBufferedImageオブジェクトがあります。

既存のコードは、次のようなJPEGImageEncoderを使用してjpegをストリーミングします。

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp.getOutputStream());
            resp.reset();
            resp.setContentType("image/jpg");
            resp.setHeader("Content-disposition", "inline;filename=xyz.jpg");
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
            param.setQuality(jpegQuality, false);
            encoder.setJPEGEncodeParam(param);
            encoder.encode(image);

これにより、ストリーミングされたjpegのファイルサイズが3倍になり、理由がわからないことに気づきました。そこで、ImageIOを使用してjpegをストリーミングしてみました。

ImageIO.write(image, "jpg", out); 

これは問題なく機能します。前任者がJPEGImageEncoderを選択した理由を判断できず、ImageIOの使用に変更した場合にどのような問題が発生するのか疑問に思っていました。両方のjpegを比較しましたが、違いを見つけることができませんでした。何かご意見は?

4

1 に答える 1

0

明確にするために、ディスクまたはデータベースのどこかにすでに具体的なJPEG画像があり、それを変更せずにクライアントに送信する必要があるだけですか? JPEGImageEncoderその場合、 (and )を使用する理由はまったくありませんImageIO

変更せずに応答本文にストリーミングするだけです。

例えば

File file = new File("/path/to/image.jpg");
response.setContentType("image/jpeg");
response.setHeader("Content-Length", String.valueOf(file.length()));

InputStream input = new FileInputStream(file);
OutputStream output = response.getOutputStream();
byte[] buffer = new byte[8192];

try {
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
}
finally {
    try { input.close(); } catch (IOException ignore) {}
    try { output.close(); } catch (IOException ignore) {}
}

JPEGImageEncoder(および) を不必要に使用して画像ファイルをストリーミングするという間違いはImageIO、ビットとバイトの性質について無知なスターターのコードによく見られます。これらのツールは、JPEG と別の画像形式の間で変換したい場合、または画像を操作 (トリミング、傾斜、回転、サイズ変更など) したい場合にのみ役立ちます。

于 2012-05-04T03:56:45.013 に答える