【发布时间】:2013-03-21 12:23:09
【问题描述】:
我只需要获取原始位图数据(无需标题或其他信息)。我使用以下代码获取位图数据:
using (Bitmap bitmap = svgDocument.Draw())
{
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
var length = Math.Abs(bitmapData.Stride) * bitmapData.Height;
byte[] bytes = new byte[length];
Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
bitmap.UnlockBits(bitmapData);
MemoryStream memoryStream = new MemoryStream();
string filename = DateTime.Now.Ticks.ToString() + ".bmp"; // this works fine
bitmap.Save(filename, ImageFormat.Bmp);
string base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks); // the base64 is reversed.
}
当我保存位图时,一切看起来都很好。图像没有反转。但是,当我仅使用字节将数据转换为 Base64 时,图像会反转。
编辑 1:
我认为这与 Base64 转换无关。似乎字节的顺序相反。
当我使用代码保存图像时,图像如下所示:
当我使用字节时,我会看到:
解决方案:
我找到了解决方案。我没有创建新的位图,而是跳过了头信息的前 54 个字节,然后存储了字节数组。
MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Bmp);
// Skip header
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54);
【问题讨论】:
-
你所说的“反转”是什么意思?你能举例说明
bytes的内容和生成的base64吗?您确定这不仅仅是您在第二种情况下保存bmp文件的方式的问题吗? -
@Mic:请看我的编辑
-
好的,你说的“用代码”和“用字节”是什么意思?您在这两种情况下使用的代码是什么?
-
“有代码”,我指的是上面使用的代码。 “使用字节”,我的意思是仅使用上面创建的字节。我使用字节生成base64字符串,任何在线测试的base64都可以解析该字符串以查看结果。在我的情况下,虽然我需要将 base64 保存到一个 xml 文件中,然后由第三方读取。好像字节顺序不对。
标签: c# image bytearray reverse