将字节数组写入文件(大文件大小)

时间:2015-04-04 14:34:15

标签: java file bitmap data-compression

我有一个灰度图像,其中我以字节的二维数组的形式表示它们,各种值取决于它们各自的比特率,即( 0 - > 255 )。然后我应用一个或多个压缩算法,即(运行长度编码)来提取另一个具有更小尺寸的字节数组,这代表压缩操作。从那里我成功地将位图文件重建为它的原始形式,它代表了解压缩操作。 我知道一切都正常,因为我通过解压缩操作得到了相同的图像。

现在我的问题是在进行压缩操作之后我想将结果数组存储到一个文件中,在该文件中,在解压缩时将提取其内容。 我已经尝试将其编写为文本文件

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

因为我的压缩数组实际上比从位图文件中提取的原始数据小得多,所以如何将其保存为比位图小的文件?

我不确定我是否已正确解释自己,如果需要,请询问更多细节。

谢谢!

1 个答案:

答案 0 :(得分:1)

我做了一些数学......

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

这意味着原始数组中的每个值实际上只保存一个位的值(这对于灰度有意义),但占用了一个字节的空间。
现在你申请了

  

一个或多个压缩算法

结果数组(rle)的可能性不大,因此实际在应用压缩之前,您将图像的大小增加8倍。

您是否有任何特殊原因没有以原始字节读取位图文件,例如像这样?:

File in = new File("d:/input.bmp");
byte[] array = new byte[(int)in.length()];
new FileInputStream(in).read(array);
相关问题