16,472
社区成员
发帖
与我相关
我的任务
分享
//****一张bmp位图包含四部分:位图文件头、信息头、颜色查找表(调色板)和位图实际数据****//
BITMAPFILEHEADER bfh; //位图文件头
BITMAPINFOHEADER bih; //位图的信息头
RGBQUAD rgb[2]={ {0,0,0,0} , {255,255,255,0} }; //定义颜色查找表,最后一个参数必须为0
BYTE *m_pDIBData; //位图实际数据
BITMAPINFO *m_pBMI; //位图信息结构体,包含位图名字、尺寸、颜色
BITMAP BM; //创建位图属性结构体
m_pBitmap->GetObject(sizeof(BM),&BM); //该函数得到指定图形对象的信息
//初始化位图文件头结构体
bfh.bfType=0x4d42; //文件类型,0x4d42刚好是字符串“BM”
bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD);//从文件头到实际的位图数据的偏移字节数
bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight; //文件大小
bfh.bfReserved1=0; //保留字
bfh.bfReserved2=0; //保留字
//初始化位图信息头结构体
bih.biSize = sizeof(BITMAPINFOHEADER); //指定这个结构的长度
bih.biWidth = m_picWidth; //指定图象的宽度,单位是象素
bih.biHeight =m_picHeight; //指定图象的高度,单位是象素
bih.biPlanes = 1;
bih.biBitCount = 1; //指定表示颜色时要用到的位数,常用的值为1(黑白图)
bih.biCompression = 0; //指定位图是否压缩
bih.biSizeImage = 0; //指定实际的位图数据占用的字节数
bih.biXPelsPerMeter = 0; //指定目标设备的水平分辨率
bih.biYPelsPerMeter = 0; //指定目标设备的垂直分辨率
bih.biClrUsed = 0; //指定本图象实际用到的颜色数
bih.biClrImportant = 0; //指定本图象中重要的颜色数
m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFO)];
m_pDIBData=(BYTE*)new char[bfh.bfSize-bfh.bfOffBits];
//将位图信息头数据拷贝到内存m_pBMI
memcpy(m_pBMI,&bih,sizeof(BITMAPINFOHEADER));
CClientDC dc(this); //创建一个窗口的客户区dc
/****获取指定兼容位图的位,然后将其作一个DIB(Device-Independent Bitmaps)
使用的指定格式复制到一个缓冲区中。****/
GetDIBits(dc.GetSafeHdc(),(HBITMAP)m_pBitmap->GetSafeHandle(), 0l, (DWORD)bih.biHeight, (LPVOID)m_pDIBData, (LPBITMAPINFO)m_pBMI, (DWORD)
DIB_RGB_COLORS);
//////////下边是将位图写入文件的////////////
CFile file;
file.Write(&bfh,sizeof(bfh)); //写入文件头
file.Write(m_pBMI,sizeof(BITMAPINFOHEADER)); //写入信息头
file.Write(rgb,2*sizeof(RGBQUAD)); //写入调色板
file.Write(m_pDIBData,BM.bmWidth*BM.bmHeight); //写入位图的实际数据
file.Close();
}