【问题标题】:Reading bytes from bmp file从 bmp 文件中读取字节
【发布时间】:2009-06-26 07:01:57
【问题描述】:

如何使用 C 从 bmp 文件中读取字节?

【问题讨论】:

    标签: c bmp


    【解决方案1】:

    这是一个通用的框架,只加载一个二进制文件,并返回一个指向第一个字节的指针。这归结为“fopen() 后跟 fread()”,但是……有点冗长。尽管检查了错误并且我相信这段代码是正确的,但没有错误处理。此代码将拒绝空文件(根据定义,这些文件不包含任何要加载的数据)。

    #include <stdio.h>
    #include <stdlib.h>
    
    static int file_size(FILE *in, size_t *size)
    {
      if(fseek(in, 0, SEEK_END) == 0)
      {
        long len = ftell(in);
        if(len > 0)
        {
          if(fseek(in, 0, SEEK_SET) == 0)
          {
            *size = (size_t) len;
            return 1;
          }
        }
      }
      return 0;
    }
    
    static void * load_binary(const char *filename, size_t *size)
    {
      FILE *in;
      void *data = NULL;
      size_t len;
    
      if((in = fopen(filename, "rb")) != NULL)
      {
        if(file_size(in, &len))
        {
          if((data = malloc(len)) != NULL)
          {
            if(fread(data, 1, len, in) == len)
              *size = len;
            else
            {
              free(data);
              data = NULL;
            }
          }
        }
        fclose(in);
      }
      return data;
    }
    
    int main(int argc, char *argv[])
    {
      int i;
    
      for(i = 1; argv[i] != NULL; i++)
      {
        void *image;
        size_t size;
    
        if((image = load_binary(argv[i], &size)) != NULL)
        {
          printf("Loaded BMP from '%s', size is %u bytes\n", argv[i], (unsigned int) size);
          free(image);
        }
      }
    }
    

    您可以使用其他答案中提供的链接轻松添加代码以解析 BMP 标头。

    【讨论】:

    • 你能添加几行来说明如何以十六进制或字符格式打印 void * 数组吗?
    【解决方案2】:

    按照其他人的建议使用 fopen 和 fread。 bmp头的格式请看here

    【讨论】:

      【解决方案3】:

      fopen 后跟 fread

      【讨论】:

      • 这个答案在技术上是正确的,不要误会我的意思,我同意 100% 这是一个有趣的答案,并且它与 abhijit 提出的问题的“风格”相匹配,但它完全违背了 Stack Overflow 的精神。我们在这里为寻求帮助的人们提供解决方案。我这样说可能会遇到麻烦,但我们应该尽我们所能帮助 OP 解决他们试图解决的任何问题。我投票给了 Naveen 和 Mattthew Flaschen。
      • eJames - 问题的答案确实是 fopen 后跟 fread。解决问题进一步归结为如何有效地使用这些功能,或者位图的磁盘格式是什么,但这些都是他们自己的不同问题。从问题的提出方式来看,目前尚不清楚障碍在哪里,但 fopen 和 fread 应该为进一步调查打开大门。我不是想搞笑,这只是我打开 SO 时最关心的问题,所以我投入了 2 美分。对不起,你不喜欢。
      【解决方案4】:

      ImageMagick supports BMP。您可以使用两种 C API 中的任何一种,低级别的 MagickCore 或更高级的 Magick Wand

      【讨论】:

        【解决方案5】:

        确保此文件未使用 RLE 方法压缩。否则,在读取头文件并知道它的尺寸之后,您必须从文件中读取并转储到缓冲区中以重建图像。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多