【发布时间】:2009-06-26 07:01:57
【问题描述】:
如何使用 C 从 bmp 文件中读取字节?
【问题讨论】:
如何使用 C 从 bmp 文件中读取字节?
【问题讨论】:
这是一个通用的框架,只加载一个二进制文件,并返回一个指向第一个字节的指针。这归结为“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 标头。
【讨论】:
按照其他人的建议使用 fopen 和 fread。 bmp头的格式请看here
【讨论】:
fopen 后跟 fread
【讨论】:
ImageMagick supports BMP。您可以使用两种 C API 中的任何一种,低级别的 MagickCore 或更高级的 Magick Wand。
【讨论】:
确保此文件未使用 RLE 方法压缩。否则,在读取头文件并知道它的尺寸之后,您必须从文件中读取并转储到缓冲区中以重建图像。
【讨论】: