2009-03-10 8 views
10

私は、ローカルに保存されたファイルからイメージを提供するサーブレットベースのアプリケーションを持っています。私は、アプリケーションがBufferedImageにイメージファイルをロードし、イメージのサイズを変更したり、ウォーターマークのテキストをイメージの上に追加したり、あるいはその両方を追加するロジックを追加しました。java BufferedImageファイルの計算方法

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

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

答えて

12

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

なぜなら、JPEGエンコーディングがファイルサイズにどのように影響するかを予測することができないからです。

また、ファイルサイズを「推測」するのは十分ではありません。 Content-Lengthヘッダーをスポットライトする必要があります。

5

BufferedImageはJPEGと書かれていることを知りません - PNG、GIF、TGA、TIFF、BMPなどがあり、それらはすべてファイルサイズが異なります。ですから、BufferedImageがファイルサイズを直接与える方法はないと思います。それを書き出し、バイト数を数えるだけで済みます。

2

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

最新の1回または2回のstackoverflowポッドキャストでは、HTTPプロキシがHTTP/1.0だけをサポートしていると報告することがよくありますが、これは問題である可能性があります。

16
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(); 
0

イメージファイルをBufferedImageとしてロードする前に、Fileオブジェクトを介してイメージファイルへの参照を行います。

File imgObj = new File("your Image file path"); 
int imgLength = (int) imgObj.length(); 

imgLengthはサイズ変更後に変化しますが、実際に実行する操作はほぼ同じですが、おおよそのイメージサイズになります。

1

メモリ内のBufferedImageのサイズは非常に簡単に計算できます。これは、DataBufferを使用してそのバッキングを行うWritableRasterのラッパーであるためです。メモリ内のサイズを計算する場合は、getData()を使用してイメージのラスタのコピーを取得し、次にラスタ内のデータバッファのサイズを測定できます。

DataBuffer dataBuffer = bufImg.getData().getDataBuffer(); 

// Each bank element in the data buffer is a 32-bit integer 
long sizeBytes = ((long) dataBuffer.getSize()) * 4l; 
long sizeMB = sizeBytes/(1024l * 1024l);`