从 bmp 文件中读取字节

发布于 2024-07-25 02:05:19 字数 30 浏览 7 评论 0原文

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

How do I read the bytes from a bmp file using C?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

稳稳的幸福 2024-08-01 02:05:19

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

Here's a general-purpose skeleton to just load a binary file, and return a pointer to the first byte. This boils down to "fopen() followed by fread()", but is a ... bit more verbose. There's no error-handling, although errors are checked for and I believe this code to be correct. This code will reject empty files (which, by definition, don't contain any data to load anyway).

#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);
    }
  }
}

You can easily add the code to parse the BMP header to this, using links provided in other answers.

無處可尋 2024-08-01 02:05:19

按照其他人的建议使用 fopen 和 fread 。 有关 bmp 标头的格式,请查看此处

Use fopen and fread as suggested by others. For the format of the bmp header take a look here

木緿 2024-08-01 02:05:19

fopen 后接 fread

fopen followed by fread

天涯离梦残月幽梦 2024-08-01 02:05:19

ImageMagick 支持 BMP。 您可以使用两个 C API 中的任何一个:低级 MagickCore 或更高级别的魔术棒

ImageMagick supports BMP. You can use either of two C APIs, the low-level MagickCore or the more high level Magick Wand.

清眉祭 2024-08-01 02:05:19

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

make sure this file is not compressed using RLE method. otherwise, you'll have to read from the file and dump into a buffer to reconstruct the image, after reading the header file and knowing it's dimensions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文