将位图转换为字节数组的C#会产生错误的数据

时间:2015-07-13 07:01:10

标签: c# arrays bitmap

我从磁盘打开一个.bmp文件,然后将其转换为字节数组。从那里,我希望将它作为十六进制字符串,以便能够在文本框中显示十六进制数据。 问题是,输出 - 在字节数组和字符串中 - 与我在notepad ++或不同的十六进制编辑器中打开.bmp时得到的十六进制数据相比较。

我的代码是

\{"name":".+?","id":"(.+?)","available":true,.+?,"synonym":""\}

结果字符串是(格式化的):

// getting image from a Picturebox
Bitmap inputBmp = (Bitmap)pictureBoxInput.Image;

// saving bmp to stream
MemoryStream imgStream = new MemoryStream();
inputBmp.Save(imgStream, inputBmp.RawFormat);

// convert to byte Array and SoapHexBinary
byte[] imgBytes = imgStream.ToArray();
SoapHexBinary imgHexBinary = new SoapHexBinary(imgBytes);

// create String out of HexBinary
string imgHexString = "";
imgHexString = imgHexBinary.ToString();

然而,根据记事本++ incl的预期输出。十六进制编辑器将是:

424D
36190000
0000
0000
36000000

28000000
28000000
28000000
0100
2000

00000000
00000000
10170000
10170000
00000000
00000000

FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00
FFE7CB00

FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00FFE7CB00...

那么有人可以解释为什么解码会有所不同吗?并且它不仅仅是解码:在手动解码的位图十六进制字符串中,只有一种颜色不断重复,四个字节     FFE7CB00 根本没有意义。我错过了什么?

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:0)

您假设您保存的位图与您加载的位图完全相同,只是假。

输出数据使得这一点非常明显:例如,重新编码的位图是32位,而原始位图是8位的调色板。更不用说原始文件有RLE了!据我所知,GDI +不支持保存RL编码的位图(虽然你可能已经注意到了,但它读得很好)。换句话说,当你有一个Bitmap实例时,它已经太晚了 - 你不再拥有原始的文件数据 - 你只有原始的位图数据。编码位图有很多种方法。

当您想要显示文件的原始数据时,只需显示文件的原始数据 - 不要对其进行解码,重新编码并显示该文件。