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

writing an array of bytes into a file (Large file size)

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

现在我的问题是在进行压缩操作后,我想将结果数组存储到一个文件中,在解压时将其内容提取回来。 我试着把它写成 text file

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 bitmap file size 32KB

compressed text file size 272KB

compressed binary file size 257KB

bitmap's byte array size 262144

compressed array size 111049

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

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

谢谢!

我做了一些数学...

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

这意味着原始数组中的每个值实际上只包含一个位的值(这对灰度有意义),但占用了 space 个字节。
现在既然你申请了

one or more compression algorithms

生成的数组不太可能出现这种情况 (rle),因此实际上在应用压缩之前,您将图像的大小增加了 8 倍。

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

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