19,468
社区成员
发帖
与我相关
我的任务
分享
// note: longth这个长宽变量必须是4的倍数,否则你这样填肯定就是错的!
// 这个没法帮你改,要不是4的倍数,自己重新分配内存去搞定~~
BITMAPFILEHEADER targetfileheader = { 0 };
BITMAPINFOHEADER targetinfoheader = { 0 };
// memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));
// memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));
//构造位图的文件头
DWORD dwCTSize = sizeof( RGBQUAD ) * 256; // 8 bit colos table size..
targetfileheader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER) + dwCTSize;
targetfileheader.bfSize=longth*longth+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + dwCTSize;
targetfileheader.bfReserved1=0;
targetfileheader.bfReserved2=0;
targetfileheader.bfType=DIB_MARKER;
//构造位图的信息头
targetinfoheader.biBitCount=8;
targetinfoheader.biSize=sizeof(BITMAPINFOHEADER);
targetinfoheader.biHeight=longth;
targetinfoheader.biWidth=longth;
targetinfoheader.biPlanes=1;
targetinfoheader.biCompression=BI_RGB;
targetinfoheader.biSizeImage=longth*longth;//+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
// 构造色彩表,这里用的是灰度..(当然,自己有色彩表直接memcpy也ok的)
RGBQUAD rgb[256] = { 0 };
for( int i = 0; i < 256; ++i ){
rgb[i].rgbBlue = rgb[i].rgbGreen = rgb[i].rgbRed = i;
}
// LPCTSTR(imgname)
CFile cf;
if(!cf.Open("切取图像.bmp",CFile::modeCreate|CFile::modeWrite))
return ;
cf.Write(&targetfileheader,sizeof(BITMAPFILEHEADER));
cf.Write(&targetinfoheader,sizeof(BITMAPINFOHEADER));
cf.Write( rgb, sizeof( RGBQUAD ) * 256 );
cf.Write(pView->ppixle_CUT,longth*longth); // ppixle_CUT为像素指针
cf.Close();