从bmp文件中读取字节

时间:2009-06-26 07:01:57

标签: c bmp

如何使用C?

从bmp文件中读取字节

5 个答案:

答案 0 :(得分:5)

这是一个通用的骨架,只需加载二进制文件,并返回指向第一个字节的指针。这归结为“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标头。

答案 1 :(得分:3)

按照他人的建议使用fopen和fread。对于bmp标题的格式,请查看here

答案 2 :(得分:2)

fopen接着是fread

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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