0

我有一个灰度图像,在其中我以二维字节数组的形式表示它们,这些字节具有不同的值,具体取决于它们各自的比特率,即(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

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

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

谢谢!

4

1 回答 1

1

我做了一些数学...

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

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

一种或多种压缩算法

结果数组rle

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

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 回答