转自:http://blog.csdn.net/yixianfeng41/article/details/52591585

一、BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

1、BMP文件头(14字节)
typedef struct                       /**** BMP file header structure ****/
{
unsigned int bfSize; /* Size of file */
unsigned short bfReserved1; /* Reserved */
unsigned short bfReserved2; /* ... */
unsigned int bfOffBits; /* Offset to bitmap data */
} MyBITMAPFILEHEADER;
2、位图信息头(40字节)
typedef struct                       /**** BMP file info structure ****/
{
unsigned int biSize; /* Size of info header */
int biWidth; /* Width of image */
int biHeight; /* Height of image */
unsigned short biPlanes; /* Number of color planes */
unsigned short biBitCount; /* Number of bits per pixel */
unsigned int biCompression; /* Type of compression to use */
unsigned int biSizeImage; /* Size of image data */
int biXPelsPerMeter; /* X pixels per meter */
int biYPelsPerMeter; /* Y pixels per meter */
unsigned int biClrUsed; /* Number of colors used */
unsigned int biClrImportant; /* Number of important colors */
} MyBITMAPINFOHEADER;
3、颜色表

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD{
BYTE rgbBlue;//蓝色的亮度(值范围为0-255)
BYTE rgbGreen;//绿色的亮度(值范围为0-255)
BYTE rgbRed;//红色的亮度(值范围为0-255)
BYTE rgbReserved;//保留,必须为0
}RGBQUAD;

颜色表中的RGBQUAD结构数据的个数由biBitCount来确定:当biBitCount=1,4,8时,分别为2,16,256个表项;当biBitCount=24时,没有颜色表项。

4、位图数据

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1个字节;

当biBitCount=4时,2个像素占1个字节;

当biBitCount=8时,1个像素占1个字节;

当biBitCount=24时,1个像素占3个字节,按顺序分别为B,G,R;

二、将rgb数据保存为bmp图片的方法

void CDecVideoFilter::MySaveBmp(const char *filename,unsigned char *rgbbuf,int width,int height)
{
MyBITMAPFILEHEADER bfh;
MyBITMAPINFOHEADER bih;
/* Magic number for file. It does not fit in the header structure due to alignment requirements, so put it outside */
unsigned short bfType=0x4d42;
bfh.bfReserved1 = ;
bfh.bfReserved2 = ;
bfh.bfSize = +sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+width*height*;
bfh.bfOffBits = 0x36; bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = ;
bih.biBitCount = ;
bih.biCompression = ;
bih.biSizeImage = ;
bih.biXPelsPerMeter = ;
bih.biYPelsPerMeter = ;
bih.biClrUsed = ;
bih.biClrImportant = ; FILE *file = fopen(filename, "wb");
if (!file)
{
printf("Could not write file\n");
return;
} /*Write headers*/
fwrite(&bfType,sizeof(bfType),,file);
fwrite(&bfh,sizeof(bfh),, file);
fwrite(&bih,sizeof(bih),, file); fwrite(rgbbuf,width*height*,,file);
fclose(file);
}

最新文章

  1. Android SDK下载和更新失败的解决方法
  2. Unity3D优化总结(一)
  3. Windows Store App JavaScript 开发:页内导航
  4. CSS学习总结(二)
  5. iOS之 PJSIP蓝牙外设音频支持
  6. http request method and response codes
  7. java SE学习之线程同步(详细介绍)
  8. Java多线程之notifyAll的作用域
  9. 对像转成 和 byte 互转类库方法
  10. Requests:Python HTTP Module学习笔记(一)(转)
  11. jvm 漫谈 笔记
  12. CentOS 6.2图形界面自定义开启终端快捷键
  13. C和C++运算符 (转)
  14. HDU1172(枚举)
  15. SQL Tuning 基础概述10 - 体会索引的常见执行计划
  16. B/S 架构中,网络模型的分解与协议解析
  17. oop6 栈 界面
  18. Yii DataProvider
  19. leetcode 刷题 数组类 Two Sum
  20. Good Bye 2017(送命场)

热门文章

  1. C++学习笔记-类相关问题总结
  2. Vim 我用的python相关插件
  3. PHP生成名片、网址二维码
  4. 接口API中的敏感数据基于AES进行安全加密后返回
  5. Ubuntu离线安装Tensorflow keras
  6. iClap:产品经理再忙也要看《琅琊榜》
  7. Extjs 正则表达式 常用的
  8. AJAX POST请求中参数以form data和request payload形式在php中的获取方式
  9. PHP分页及原理
  10. php项目代码 编码格式不对会大范围报错