【问题标题】:How to avoid the header data from a byte array of bitmap如何避免位图字节数组中的标头数据
【发布时间】:2013-07-21 05:22:47
【问题描述】:

我正在尝试将位图图像转换为 C# 中的字节数组。但是根据位图格式,前 12 个字节将被分配给位图标头。

// Converting the bitmap image data to byte array
 byte[] bitmapFileData = System.IO.File.ReadAllBytes(bitmapImageFilePath);

我调试这段代码,但它对于我给定的单色位图图像,前 56 个字节填充了一些其他数据,然后从 (0, 0, 0, 255, 255,255,255,255......) 开始。 由于其单色位图图像,字节数组仅包含(0,0,0,255 和 255,255,255,255)的 RGB。

我的问题是,如何从字节数组中过滤位图标头,以便我可以将数组的其余部分用作位图数据。我知道位图格式的偏移值会解释。那么字节数组的哪个元素给出了偏移值呢?

如果这是一个基本问题或在不同论坛上讨论过,请原谅。 我是成像部分的新手,并且做了很多谷歌搜索,但无法获得完美的理解。

能否请您提供所需的信息。

意图: 1. 将位图图像转换为二进制数据 2. 了解图片格式的东西

我在哪里使用: 1. 在其中一台打印机上打印给定的位图图像,该打印机将获取图像的十六进制字符串或二进制数据。

【问题讨论】:

    标签: c# bitmap c#-2.0 bitmapimage bitmapdata


    【解决方案1】:

    根据Bitmap Storage,该文件包含BITMAPFILEHEADER,后跟BITMAPINFOHEADERBITMAPFILEHEADER 包含一个字段bfOffBits,它给出了位图数据第一个字节的偏移量。所以你应该能够读取文件,找到bfOffBits 字段,并使用它来索引数组。

    例如:

    byte[] imageBytes = File.ReadAllBytes("filename.bmp");
    int dataOffset = BitConverter.ToInt32(imageBytes, 10);
    int firstPixelValue = imageBytes[dataOffset];
    

    如果你想知道多少像素,你必须阅读BITMAPINFOHEADER。您最好获取 pinvoke 签名(请参阅 pinvoke.net 上的 BITMAPFILEHEADER)并使用一些不安全的代码来设置指向这些结构的指针,以便它们引用数组中的值。

    类似:

    BITMAPFILEHEADER* bfh = (BITMAPFILEHEADER*)(&imageBytes[0]);
    BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)(&imageBytes[14]);
    

    也就是说,如果您真的想使用原始数据而不是从文件中构造 Bitmap 对象。

    【讨论】:

      【解决方案2】:

      为什么不将它作为位图打开并从那里转换?

      using(Stream BitmapStream = System.IO.File.Open(fileName,System.IO.FileMode.Open ))
          {
               Image img = Image.FromStream(BitmapStream);
      
               mBitmap=new Bitmap(img);
               //...do whatever
          }
      

      这篇文章讨论了将图像转换为字节数组

      Convert a bitmap into a byte array

      【讨论】:

      • 我现在试过了。位图对象在构建时的一些输入。在 C# 中,我找不到加载位图图像的加载功能。我明白了你的意图,如果我们加载位图图像,它会自动过滤位图标题。但我想要另一种方式,当我从位图中提取字节数组时,我应该能够在偏移值的帮助下避免标题信息。而且字节数组中也提到了这个偏移值,但是我不知道偏移值在哪个位置?如果我以错误的方式理解您的评论,请您更详细地解释一下。谢谢你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2022-11-10
      • 2013-09-08
      • 2015-08-08
      • 2011-11-29
      相关资源
      最近更新 更多