【问题标题】:C# converting bitmap to byte array gives wrong dataC# 将位图转换为字节数组会给出错误的数据
【发布时间】:2015-07-13 07:01:10
【问题描述】:

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

我的代码是

// 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();

生成的字符串是(格式化的):

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...

但是根据 notepad++ 的预期输出,包括。十六进制编辑器将是:

42 4D
E0 01 00 00
00 00
00 00
7A 00 00 00

28 00 00 00
28 00 00 00
28 00 00 00
01 00
08 00

01 00 00 00
66 01 00 00
10 17 00 00
10 17 00 00
11 00 00 00
11 00 00 00

05 00 02 00
05 09 07 00
18 11 10 00
1F 21 20 00
39 32 31 00
46 3E 3D 00
6E 67 5F 00
7E 77 6F 00
91 8D 83 00
96 95 89 00
BA B2 A7 00
D3 C4 BA 00
F2 DE CE 00
ED E3 C6 00
FF E7 CB 00
FE EC CF 00
FF FF FF 00

28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00
28 0E 00 00 28 0E 00 00 28 0E 00 00 28 0E 00 00 17 0E 01 09
01 02 0F 0E 00 00 16 0E 00 03 05 02 02 00 0F 0E 00 00 15 0E
00 04 02 00 00 02 0F 0E 00 00 13 0E 00 06 09 00 00 00 02 02 ...

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

感谢您的帮助和建议。

【问题讨论】:

  • 不,不是。我也尝试使用转换器解决方案:byte[] imgBytes = (byte[])converter.ConvertTo(inputBmp, typeof(byte[])); 但这导致了相同的结果。
  • 你为什么要从图片框中截取图像?只需使用原始文件。哦,使用 SoapHexBinary 除了 SOAP 十六进制二进制文件之外的任何东西听起来都是个坏主意 :)

标签: c# arrays bitmap


【解决方案1】:

您认为您保存的位图与您加载的位图相同的假设是错误的。

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

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

【讨论】:

  • 嘿,谢谢你的建议,我没想到 - 正如你所解释的那样,现在确实很明显,但我在位图和编码/解码方案方面的经验还不到两天。以前从未使用过。您能给我一个建议或代码示例如何获取位图的原始数据吗?最后,我想查看和操作十六进制数据(作为字符串)。
  • @EmanuelLeicht 在某些时候,您正在从文件中读取数据 - 只需将文件直接读取到字节数组中(例如,使用 File.ReadAllBytes)。然后,您也可以使用相同的字节数组来构造位图(例如,在字节数组顶部使用 MemoryStream)。
猜你喜欢
  • 2010-09-26
  • 2015-07-07
  • 2016-08-23
  • 2023-04-08
  • 2018-05-06
  • 2012-11-09
  • 2011-06-26
  • 2013-01-14
相关资源
最近更新 更多