|
引用 5 楼 nommm 的回复:
你想得到位图文件(bmp)里面图素的一部分,那首先打开文件然后读入到内存(CreateFile和ReadFile)。
然后,你能得到文件在内存里面的指针(ReadFile的参数2输出),姑且叫pfile,类型转换成BITMAPFILEHEADER *;
之后,就可以得到图素数据的指针:
pBits = (BYTE *) pfile + pfile->bfOffBits ; //这个就是图……
下面是我的代码:
void CPng_ce_TestDlg::CreateBMPFile(LPTSTR pszFile,LPRECT lpRect)
{
CClientDC dc(this);//获取对话窗口客户区
HDC hScrDC;//创建屏幕设备描述表
HDC hMemDC;//创建内存设备描述表
HBITMAP hBitmap;
HGDIOBJ hOldBitmap;
//保存点的颜色值
BYTE *lpBits = NULL;
CRect rect;
BITMAPINFO rgb24bits;
int nX,nY,nX2,nY2;//选定区域坐标
//int nWidth,nHeight;//对话框大小
int xScrn, yScrn;
if(IsRectEmpty(lpRect))//确保选中区域不为空矩形
return;
hScrDC=dc;//获取对话框句柄
hMemDC=CreateCompatibleDC(hScrDC);//为屏幕设备描述表创建兼容的内存设备描述表
//获得选定的区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2-nX;
nHeight= nY2-nY;
ZeroMemory(&rgb24bits, sizeof(BITMAPINFO));
rgb24bits.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
rgb24bits.bmiHeader.biWidth = nWidth;
rgb24bits.bmiHeader.biHeight = nHeight;
rgb24bits.bmiHeader.biPlanes = 1;
rgb24bits.bmiHeader.biBitCount = 24;//保存为24位
rgb24bits.bmiColors[0].rgbBlue = 0;
rgb24bits.bmiColors[0].rgbGreen = 0;
rgb24bits.bmiColors[0].rgbRed = 0;
rgb24bits.bmiColors[0].rgbReserved = 0;
hBitmap = CreateDIBSection(hMemDC, (BITMAPINFO*)&rgb24bits,DIB_RGB_COLORS,(void **)&lpBits,NULL,0);
hOldBitmap = SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);
//初始化位图文件头结构
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((nWidth*nHeight)*3);
DWORD dwNumBytes;
//创建新位图
HANDLE hFile = CreateFile(pszFile,GENERIC_WRITE,(DWORD) 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
//不为空
if (hFile == INVALID_HANDLE_VALUE)
return ;
//写入头文件
WriteFile(hFile, &bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), &dwNumBytes, NULL);
//写入信息头
WriteFile(hFile, &(rgb24bits.bmiHeader), sizeof(BITMAPINFOHEADER), &dwNumBytes, NULL);
//写入RGB数据.CreateDIBSection返回的第四个参数是没有内容的。要向里面写入数据才可以显示图片
WriteFile(hFile,lpBits,3*nWidth*nHeight,&dwNumBytes, NULL);
这是我加进去的,是这样定义吗?
BITMAPFILEHEADER *bmpFileHeader;
ReadFile(hFile,lpBits,3*nWidth*nHeight,&dwNumBytes,NULL);
bmpFileHeader=(BITMAPFILEHEADER *)lpBits;
BYTE *lpbit=(BYTE *)bmpFileHeader+bmpFileHeader->bfOffBits;还是BYTE *lpbit=(BYTE *)lpbits+bmpFileHeader->bfOffBits;
比如说 r 表示Red的,我是不是这样写byte r=*lpbit;取他的red值?
FlushFileBuffers(hFile);
CloseHandle(hFile);
//删除
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(hBitmap);
DeleteObject(hOldBitmap);
} |
|