【问题标题】:How does Bitmap.Save(Stream, ImageFormat) format the data?Bitmap.Save(Stream, ImageFormat) 如何格式化数据?
【发布时间】:2010-04-07 10:44:50
【问题描述】:

我有一个长度为 2480 宽度为 3507 的非透明彩色位图。

使用Bitmap.GetPixel(int x, int y)我可以得到位图中每个像素的颜色信息。

如果我将位图喷成字节[]:

MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Bmp);
ms.Position = 0;
byte[] bytes = ms.ToArray();

那么我希望得到相同的信息,即我可以转到 bytes[1000] 并读取该像素的颜色信息。

事实证明,我的字节数组比我预期的要大。我以为我会得到一个包含 2480 x 3507 = 8697360 个元素的数组。相反,我得到了一个包含 8698438 个元素的数组——我认为是某种标题。

我的数组中的字节以什么格式存储?是否有一个 1078 字节长的标头,后跟每个字节元素的 Alpha、Red、Green、Blue 值或其他值?

我只需要每个像素的颜色信息。我不关心标题(或者实际上是透明度),除非我需要它来获取颜色信息。

【问题讨论】:

    标签: c# .net bitmap byte


    【解决方案1】:

    您正在调用 GetBuffer,它返回底层字节数组 - 这比流的实际长度大。

    任一使用

    byte[] bytes = ms.ToArray();
    

    使用GetBuffer,但与ms.Length结合使用。

    话虽如此,您将其保存为 BMP - 所以还会有标题信息;它不像第一个字节将代表第一个像素。不幸的是,据我所知,没有“原始”图像格式......这就是你真正想要的。

    如果需要,您可以使用Bitmap.LockBits,然后从那里复制数据...

    【讨论】:

    • 我已经更改了我的代码来获取数组,但我仍然得到相同数量的字节(我想我的 MemoryStream 很幸运)
    • 谢谢,我需要的是 Lockbits。我认为bobpowell.net/lockingbits.htm 将帮助我到达我需要去的地方。
    【解决方案2】:

    如果我正确理解有关Bitmap.Save 的文档,它将以指定格式保存图像,这意味着您将在字节数组中拥有位图标题。我认为您应该阅读一些有关bitmap format 的文档,以了解如何在您的数组中获取所需的信息

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多