0

私は、それぞれのビットレート、つまり(0 ->255 )に応じてさまざまな値を持つバイトの2次元配列の形式でそれらの表現を取得するグレースケール画像を持っています。次に、1 つまたは複数の圧縮アルゴリズム(ランレングス エンコーディング)を適用 して、サイズがはるかに小さい別のバイト配列を抽出します。これは圧縮操作を表します。それから、解凍操作を表すビットマップファイルを元の形式に正常に再構築します。解凍操作の結果として同じ画像が返されるので、すべてがうまくいっていることがわかります。

今私の問題は、圧縮操作を行った後、結果の配列をファイルに保存し、その内容が解凍時に抽出されることです。テキストファイルとして書いてみました

FileOutputStream output = new FileOutputStream(new File("d:/"+ fileName+".jrle"));
IOUtils.write(rle, output);

バイナリファイルとして書いてみました

ObjectOutputStream myStream = new ObjectOutputStream(new FileOutputStream("d:/"+fileName+".dat"));
myStream.writeObject(rle);

ただし、どちらの場合も、このファイルのサイズは元のビットマップ ファイルのサイズよりもはるかに大きくなります。

512x512 ビットマップ ファイルサイズ 32KB

圧縮テキストファイルサイズ 272KB

圧縮バイナリファイルサイズ 257KB

ビットマップのバイト配列サイズ 262144

圧縮配列サイズ 111049

圧縮された配列は実際にはビットマップ ファイルから抽出された元の配列よりもはるかに小さいため、ビットマップよりも小さいサイズのファイルとして保存するにはどうすればよいですか?

私は自分自身を適切に説明したかどうか確信が持てません。必要に応じて詳細を尋ねてください。

ありがとう!

4

1 に答える 1

1

私はいくつかの計算をしました...

512 * 512 = 262144
32 KB = 32768
262144 / 32768 = 8

これは、元の配列のすべての値が実際にはビットの値を保持するだけで (グレースケールでは意味があります)、1 バイトのスペースを占有することを意味します。
申し込んでから今

1 つ以上の圧縮アルゴリズム

結果の配列 ( ) に同じことが当てはまる可能性は非常に低いrleため、実際には圧縮を適用する前に、画像のサイズを 8 倍に増やします。

ビットマップ ファイルを raw バイトで読み取っていない特定の理由はありますか?たとえば、次のようになります。

File in = new File("d:/input.bmp");
byte[] array = new byte[(int)in.length()];
new FileInputStream(in).read(array);
于 2015-04-04T16:44:45.783 に答える