c语言读取bmp文件
2017-12-01 16:12
281 查看
一、了解BMP文件的格式:位图文件头、位图信息段、调色板信息(一般都没有)、位图数据,各部分关键字段。
详细信息参见:http://blog.csdn.net/lanbing510/article/details/8176231
读取BMP文件的函数所需要的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "bmpstru.h"
#define Malloc(type, n) (type *)malloc(n * sizeof(type))
二中的结构体定义我建立了一个头文件 "bmpstru.h",并且将该函数封装了,以后使用直接调用。
二、bmpstru.h中构造位图文件头、位图信息段、位图数据结构体
1)位图文件头
typedef struct BmpHeader{
char bfType[10];
int bfSize;
int bfReserved1;
int bfReserved2;
int bfoffBits;
} BMPHEADER;
2)位图信息段
typedef struct BmpInfoHeader{
int biSize;
int biWidth;
int biHeight;
int bitPlanes;
int biBitCount;
int biCompression;
int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
int biClrUsed;
int biClrImportant;
} BMPINFOHEADER;
3)位图数据
typedef struct BmpMata{
unsigned int r;
unsigned int g;
unsigned int b;
}BMPDATA;
三、读取BMP文件函数用fopen()打开文件,并判断是否打开成功
if((file = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "文件打开失败!");
exit(1);
}
四、读取BMP文件函数初始化位图文件头、位图信息段
//读取bmp的BMPHEADER信息
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
fread(&tmp[1], 1, 1, file);
//pic.bmphd.bfType
//itoa(tmp[0], &pic.bmphd.bfType[0], 10);
//itoa(tmp[1], &pic.bmphd.bfType[1], 10);
//printf("success...");
//system("pause");
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmphd.bfSize = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmphd.bfReserved1 = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmphd.bfReserved2 = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmphd.bfoffBits = tmp[0];
//读取bmp的BMPINFOHEADER信息
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biSize = tmp[0];
//图像width
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biWidth = tmp[0];
//图像height
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biHeight = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1,2, file);
pic.bmpinfohd.bitPlanes = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmpinfohd.biBitCount = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biCompression = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biSizeImage = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biXPelsPerMeter = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biYPelsPerMeter = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biClrUsed = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biClrImportant = tmp[0];
获得了图片的高和宽:pic.bmpinfohd.biWidth、
pic.bmpinfohd.biHeight;
五、构造二维数组,并读取RGB值
BMPDATA **pixel = Malloc(BMPDATA *, pic.bmpinfohd.biHeight);
for(int i = 0; i < pic.bmpinfohd.biHeight; i++)
{
pixel[i] = Malloc(BMPDATA, pic.bmpinfohd.biWidth);
}
for(int i = 0; i < pic.bmpinfohd.biHeight; i++)
for(int j = 0; j < pic.bmpinfohd.biWidth; j++)
{
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].r = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].g = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].b = tmp[0];
}
经过上述5步,BMP文件的RGB值就保存到pixel二维数组中了
详细信息参见:http://blog.csdn.net/lanbing510/article/details/8176231
读取BMP文件的函数所需要的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "bmpstru.h"
#define Malloc(type, n) (type *)malloc(n * sizeof(type))
二中的结构体定义我建立了一个头文件 "bmpstru.h",并且将该函数封装了,以后使用直接调用。
二、bmpstru.h中构造位图文件头、位图信息段、位图数据结构体
1)位图文件头
typedef struct BmpHeader{
char bfType[10];
int bfSize;
int bfReserved1;
int bfReserved2;
int bfoffBits;
} BMPHEADER;
2)位图信息段
typedef struct BmpInfoHeader{
int biSize;
int biWidth;
int biHeight;
int bitPlanes;
int biBitCount;
int biCompression;
int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
int biClrUsed;
int biClrImportant;
} BMPINFOHEADER;
3)位图数据
typedef struct BmpMata{
unsigned int r;
unsigned int g;
unsigned int b;
}BMPDATA;
三、读取BMP文件函数用fopen()打开文件,并判断是否打开成功
if((file = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "文件打开失败!");
exit(1);
}
四、读取BMP文件函数初始化位图文件头、位图信息段
//读取bmp的BMPHEADER信息
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
fread(&tmp[1], 1, 1, file);
//pic.bmphd.bfType
//itoa(tmp[0], &pic.bmphd.bfType[0], 10);
//itoa(tmp[1], &pic.bmphd.bfType[1], 10);
//printf("success...");
//system("pause");
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmphd.bfSize = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmphd.bfReserved1 = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmphd.bfReserved2 = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmphd.bfoffBits = tmp[0];
//读取bmp的BMPINFOHEADER信息
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biSize = tmp[0];
//图像width
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biWidth = tmp[0];
//图像height
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biHeight = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1,2, file);
pic.bmpinfohd.bitPlanes = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 2, file);
pic.bmpinfohd.biBitCount = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biCompression = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biSizeImage = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biXPelsPerMeter = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biYPelsPerMeter = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biClrUsed = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 4, file);
pic.bmpinfohd.biClrImportant = tmp[0];
获得了图片的高和宽:pic.bmpinfohd.biWidth、
pic.bmpinfohd.biHeight;
五、构造二维数组,并读取RGB值
BMPDATA **pixel = Malloc(BMPDATA *, pic.bmpinfohd.biHeight);
for(int i = 0; i < pic.bmpinfohd.biHeight; i++)
{
pixel[i] = Malloc(BMPDATA, pic.bmpinfohd.biWidth);
}
for(int i = 0; i < pic.bmpinfohd.biHeight; i++)
for(int j = 0; j < pic.bmpinfohd.biWidth; j++)
{
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].r = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].g = tmp[0];
memset(tmp, 0, 20);
fread(tmp, 1, 1, file);
pixel[i][j].b = tmp[0];
}
经过上述5步,BMP文件的RGB值就保存到pixel二维数组中了
相关文章推荐
- BMP头文件格式以及C语言读取头文件
- 【转】BMP头文件格式以及C语言读取头文件
- c语言读取bmp文件完整版
- BMP头文件格式以及C语言读取头文件(二)
- c语言读取bmp文件格式(转载)
- C语言读取和显示BMP文件
- BMP头文件格式以及C语言读取头文件(一)
- BMP头文件格式以及C语言读取头文件(二)
- opengl读取24位BMP文件为纹理并处理黑色背景为透明
- C语言从文本文件中用字符串读取一行数据,然后再依次遍历字符串将字符串中数据分配。
- 【OPENGL】读取并显示BMP文件
- VS2010 调用fopen函数读取bmp文件时,提示“CXX0030:错误,无法计算表达式的值,错误的指针”
- 读取到配置文件的C语言的接口实现
- java读取bmp图像文件
- C语言中文件的读取和写入
- c语言把文件中数据读取并存到数组中
- C语言从文件中读取多行用逗号分隔数据的解决方案
- 遍历文件目录及bmp位图信息头的读取
- BMP图像数据的C语言读取源码
- 飞鸽传书 CFile 来读取位图 BMP 文件