19

ローカルに保存されたファイルから画像を提供するサーブレット ベースのアプリケーションがあります。アプリケーションが画像ファイルを BufferedImage にロードしてから、画像のサイズを変更したり、画像の上に透かしテキストを追加したり、またはその両方を実行できるようにするロジックを追加しました。

画像を書き出す前にコンテンツの長さを設定したいと思います。イメージを一時ファイルまたはバイト配列に書き込む以外に、BufferedImage のサイズを見つける方法はありますか?

サイズの計算に役立つ場合、すべてのファイルは jpg として書き込まれます。

4

6 に答える 6

21
    BufferedImage img = = new BufferedImage(500, 300, BufferedImage.TYPE_INT_RGB);

    ByteArrayOutputStream tmp = new ByteArrayOutputStream();
    ImageIO.write(img, "png", tmp);
    tmp.close();
    Integer contentLength = tmp.size();

    response.setContentType("image/png");
    response.setHeader("Content-Length",contentLength.toString());
    OutputStream out = response.getOutputStream();
    out.write(tmp.toByteArray());
    out.close();
于 2011-02-09T11:57:01.987 に答える
15

いいえ、メモリ内または一時ファイルにファイルを書き込む必要があります。

その理由は、JPEG エンコーディングがファイル サイズにどのように影響するかを予測することが不可能だからです。

また、ファイル サイズを「推測」するだけでは十分ではありません。ヘッダーはContent-Lengthスポットオンでなければなりません。

于 2009-03-10T20:56:34.583 に答える
5

BufferedImage は、それが JPEG として書き込まれていることを認識していません。それに関する限り、PNG、GIF、TGA、TIFF、または BMP である可能性があり、それらはすべてファイル サイズが異なります。したがって、BufferedImage がファイル サイズを直接提供する方法はないと思います。書き出してバイト数を数えるだけです。

于 2009-03-10T20:56:44.287 に答える
2

非常に小さな画像ファイルでない限り、コンテンツの長さを指定するよりも、チャンク エンコードを使用することをお勧めします。

最近の 1 つまたは 2 つのスタックオーバーフロー ポッドキャストで、HTTP プロキシが HTTP/1.0 のみをサポートしていると報告されることが多く、これが問題になる可能性があることが指摘されました。

于 2009-03-10T21:07:15.663 に答える