//图像灰度化处理 void ImageGrayProcess(HBITMAP hBitmap, BOOL bAvgType=TRUE) { if(hBitmap) { CBitmap *bmpSrc = CBitmap::FromHandle(hBitmap); BITMAP bmSrcInfo; bmpSrc->GetBitmap( &bmSrcInfo ); DWORD dwBmByteSize = bmSrcInfo.bmWidthBytes * bmSrcInfo.bmHeight; LPBYTE pBmBits = (LPBYTE) GlobalAlloc(GPTR, dwBmByteSize); bmpSrc->GetBitmapBits(dwBmByteSize, pBmBits); int nPixBytes = bmSrcInfo.bmBitsPixel/8; if(nPixBytes > 1) { int nRemainLineBytes = bmSrcInfo.bmWidthBytes - bmSrcInfo.bmWidth * nPixBytes; //每行剩余字节数 DWORD dwOffset = 0; for(long nHeight=0; nHeight<bmSrcInfo.bmHeight; nHeight++) { for(long nWidth=0; nWidth<bmSrcInfo.bmWidth; nWidth++) { DWORD dwSum = 0; int Min = 0x7FFF, Max = 0; for(int np=0; np<nPixBytes; np++) { BYTE bCR = pBmBits[dwOffset + np]; dwSum += bCR; if(Min > bCR) Min = bCR; if(Max < bCR) Max = bCR; } BYTE Gray = 0; if(bAvgType) Gray = (BYTE)(dwSum / nPixBytes); //均值 else Gray = (BYTE)((Min + Max)/2); //中值 for(int np2=0; np2<nPixBytes; np2++) { pBmBits[dwOffset + np2] = Gray; } dwOffset += nPixBytes; } dwOffset += nRemainLineBytes; } } bmpSrc->SetBitmapBits(dwBmByteSize, pBmBits); GlobalFree(pBmBits); } }