图像处理Bmp文件存储顺序
- 格式:docx
- 大小:20.50 KB
- 文档页数:5
读写Bmp文件的方法步骤:
读:
1.读方式打开文件
2.读入BITMAPFILEHEADER结构
3.读入BITMAPINFOHEADER结构
4.读入颜色表RGBQUAD结构
5.读入位图数据
6.关闭文件
写:
1.写方式打开文件
2.填写BITMAPFILEHEADER结构并写入文件
3.写入BITMAPINFHEADER结构并写入文件
4.写颜色表进文件
5.写位图数据进文件
6.关闭文件
①:位图文件头
BITMAPFILEHEADER: (14字节)
bfType :位图文件类型(0x4D42)
bfSize :位图文件大小
bfReserved1: Windows保留字1
bfReserved2: Windows保留字2
bfOffBits: 从文件头到实际位图数据的偏移字节数
=文件头+ 信息头+调色板长度。
②:位图信息头(40字节)
biSize: 本结构长度为40字节
biWidth: 位图宽度,(像素为单位)
biHeight: 位图的高度,(像素为单位)
biPlanes: 设为1
biCount: 位深度
biCompression: 为0:不压缩;1:8位压缩;2:4位压缩。
biSizeImage:实际的位图数据占用的字节数biXPelsPerMeter:水平分辨率(像素/米)biYPelPerMeter: 垂直分辨率(像素/米)
biClrCount:位图实际用到的颜色数(为0时,颜色数为2的biBitCount次幂)
biClrImportant:位图显示过程中重要的颜色数(0:都是重要的)
③:颜色表(4字节)
rgbBlue:蓝色分量
rgbGreen:绿色分量
rgbRed: 红色分量
rgbReserved:保留字节
颜色表的大小:二值图像:大小=2*sizeof(RGBQUAD)=8
8位灰度图像:大小= 256*sizeof(RGBQUAD)= 1024
24位真彩色图像无颜色表
④位图数据
8位灰度图像ColorTablesize = 1024;
lineByte =(bmpWidth * biBitCount / 8 + 3)/4 *4;
1.申请位图文件头结构变量,并填写文件头信息BITMAPFILEHEADER fileHeader;
fileHead.bfType = 0x4D42; //bmp类型
//bfSize是图像文件4个组成部分之和
fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAOINFOHEADER) + ColorTablesize + lineByte*Height;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
//bfOffBits是图像文件前3部分所需空间之和fileHead.bfOffBits = 54 + ColorTablesize;
2.申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;
head.biBitCount = biBitCount;
head.biClrImportant = 0;
head.biClrUsed = 0;
head.biCompression = 0;
head.biHeight = height;
head.biSize = 40;
head.biSizeImage = lineByte * height;
head.biWidth = width;
head.biXPelsPerMeter = 0;
head.biYPelsPerMete = 0;
3.写灰度图像的颜色表
4.写位图数据进文件
调色板句柄HPALETTE
文件头指针LPBITMAFILEHEADER : m_lpDib
信息头指针LPBITMAPINFOHEADER :m_lpBmpInfoHead 颜色表LPRGBQUAD : m_lpColorTable 信息指针LPBITMAPINFO :m_lpBmpInfo
图像数据指针:m_pImgData (包括:信息头指针和颜色表)
1读入一幅图像(即打开操作):
将四部分都考虑进去(1,2,3,4);
2写入一幅图像(即保存操作):
将四部分都考虑进去(1,2,3,4)
3显示一幅图像:
只需将3部分考虑进去(2,3,4)
4 处理一幅图像:
只需将3部分考虑进去(2,3,4)
位图显示和数据处理:
将(位图信息头、颜色表)即:信息指针内容,位图数据指针依次写入,并进行操作。
显示图像的函数:见P50
StretchDIBits();
设置位图伸缩模式:
SetStretchBltMode(COLORONCOLOR);
类的构造函数:
用来完成数据成员的初始化工作,系统在创建类的对象的同时,自动调用构造函数。
类的析构函数:
用来释放被分配的内存空间,当类的对象消失时,系统自动调用析构函数。