gpt4 book ai didi

c# - 转换为 Base64 时从字节数组中获取反转图像

转载 作者:行者123 更新时间:2023-11-30 18:34:50 32 4
gpt4 key购买 nike

我只需要获取原始位图数据(没有标题或其他信息)。我使用以下代码获取位图数据:

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转换无关。似乎字节的顺序是相反的。

当我使用代码保存图像时,图像看起来像这样:

enter image description here

当我使用字节时,我会看到:

enter image description here

解决方案:

我找到了解决方案。我没有创建新的位图,而是跳过了头信息的前 54 个字节,然后存储了字节数组。

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Bmp);

// Skip header
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54);

最佳答案

标准的 BMP 格式允许以经典的上下顺序或相反的顺序存储图像的字节。

判断图像是否以这种方式存储的方法是检查 Height 的值BMP头中的参数:

  • 如果 Height < 0 , 那么你的图片的高度是 abs(Height)并且像素以相反(底部/顶部)顺序存储。

  • 如果 Height > 0 ,那么您就会遇到您期望的情况,其中像素按“正常”顺序从上到下排列。

我想说的是,在您的情况下,您是从存储负片 Height 的图像开始的。 header (SVG 对象出于某种原因必须这样做)。但是您不检查它,所以您按从下到上的顺序存储像素。

当您使用 BMP 存储时对象,它会根据上下文为您计算出来。但是,当您仅导出像素时,加载图像的第三方应用程序会看到正值 Height从而颠倒显示您的图像。

您可以在 Wikipedia page for BMP file format 中找到有关此像素排序的详细信息.

编辑:

因此,当您将 BMP 文件写入磁盘时,您必须执行以下操作:

  1. 检查您的字节是按从上到下的顺序 (a) 还是从下到上的顺序 (b)

  2. 如果 (a):将 height将您的图像作为 BMP header 中的正值

  3. 如果 (b):放 - height作为 BMP header 中的负值。以便显示您的图像的第三方程序知道它是颠倒的。

关于c# - 转换为 Base64 时从字节数组中获取反转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726310/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com