第一步,你必须知道位图即BMP格式的文件的结构.
位图(bmp)文件由以下几个部分组成:
1.BITMAPFILEHEADER,它的定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType. //必须为’BM’
DWORD bfSize. //文件大小
WORD bfReserved1. //必须为0
WORD bfReserved2. //必须为0
DWORD bfOffBits. //从ITMAPFILEHEADER到存放bmp数据的偏移量
} BITMAPFILEHEADER, *PBITMAPFILEHEADER.
2.BITMAPINFOHEADER,它的定义如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize. //此结构的大小,可用sizeof(BITMAPINFOHEAER)得到
LONG biWidth. //位图宽度,以象素为单位
LONG biHeight. //位图高度,以象素为单位
WORD biPlanes. //必须为1
WORD biBitCount.//位图象素位数,可为0,1,4,8,24,32
DWORD biCompression.
DWORD biSizeImage. //(仅用于压缩)
LONG biXPelsPerMeter. //一米横向象素数
LONG biYPelsPerMeter. //一米纵向象素数
DWORD biClrUsed.// (非零用语短颜色表)
DWORD biClrImportant.
} BITMAPINFOHEADER, *PBITMAPINFOHEADER.
由于以上信息可以直接从MSDN上查到,所以只做简单介绍,你可以自己查看NSDN帮助,上面有很详细的介绍.
3.DIB位图像.这里放的是真正的位图数据.
知道了位图的存放格式,下面我们就可以很容易的把它读如内存.
第二步,读入bmp图像
LPCTSTR lpszFileName4="untitled.bmp". //文件路径
CFile file. //用于读取BMP文件
BITMAPFILEHEADER bfhHeader.//bmp文件头
BITMAPINFOHEADER bmiHeader. //bmp格式头
LPBITMAPINFO lpBitmapInfo. //bmp格式具体信息
int bmpWidth=0. //图片宽度
int bmpHeight = 0. //图片高度
if(!file.Open(lpszFileName,CFile::modeRead))
return . //打开文件
file.Read(&.bfhHeader,sizeof(BITMAPFILEHEADER)).//读取文件头
if(bfhHeader.bfType!=((WORD) (’M’<<8)|’B’)) //判断是否是"BM"
return .
if(bfhHeader.bfSize!=file.GetLength())
return .
if (file.Read((LPSTR)&.bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
return .
bmpHeight = bmiHeader.biHeight.//得到高度和宽度
bmpWidth = bmiHeader.biWidth.
file.SeekToBegin().
file.Read(&.bfhHeader,sizeof(BITMAPFILEHEADER)).
UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER).
lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen].
file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen).
if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
return .
DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits.
LPVOID lpSrcBits=new BYTE[dwBitlen]. //将数据读入lpSrcBits数组
file.ReadHuge(lpSrcBits,dwBitlen).
file.Close(). //关闭文件
相关文章
从FORM中调用REPORT的实用技巧
报检考试法规:中华人民共和国对外贸易法
Oracle中对像名大小写敏感性的深入解析
甲骨文亚太大会今日在沪开幕
如何在vc 中旋转位图
C 内存管理基础之new&0delete
C 编程中的四个调试小技巧
轻松使用C 深入研究.NET委托与事件设计
C 基础:常量成员函数特殊说明
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛