/************************************************************************* * 函数名称:Gray24Bits( ) * 函数类型:LPSTR * 参数: LPSTR lpDIB - 指向源DIB图像指针 * 返回值: BOOL - 转换成功返回TRUE,否则返回FALSE。 * 函数功能:24位真彩色图像转8位灰度图像 *************************************************************************/ BOOL Gray24Bits(LPSTR lpDIB) { // 找到DIB图像象素起始位置 LPSTR lpDIBBits; // 指向DIB象素指针 lpDIBBits =FindDIBBits(lpDIB); LPBITMAPINFOHEADER lpDIBHdr; // 指向BITMAPINFOHEADER的指针 lpDIBHdr = (LPBITMAPINFOHEADER)lpDIB; LPSTR lpGrayBits; // 计算位图图的信息头、调色板和图形数据的大小, 并给灰度图分配内存 int dwInfo = lpDIBHdr->biSize; int dwData = lpDIBHdr->biSizeImage; dwData=(lpDIBHdr->biHeight) * (lpDIBHdr->biWidth); int dwGrayData = dwData/3; int dwGrayPal = 256 * sizeof(RGBQUAD); int sizeTotal=dwInfo+dwGrayPal+dwGrayData; // 创建灰度图的颜色表 RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpDIB+lpDIBHdr->biSize);//指向内存中的灰度颜色表 int rowLenSr=WIDTHBYTES(24*lpDIBHdr->biWidth);//行字节数 int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth); int sizeGrayBits=rowLenDes*lpDIBHdr->biHeight; int i; if(24==lpDIBHdr->biBitCount) { lpDIBHdr->biSizeImage=sizeTotal; lpDIBHdr->biBitCount=8; lpDIBHdr->biClrUsed=256; for(i=0;i <256;i++) { lpGrayRgbQuag->rgbBlue=i; lpGrayRgbQuag->rgbGreen=i; lpGrayRgbQuag->rgbRed=i; lpGrayRgbQuag->rgbReserved=0; lpGrayRgbQuag++;//写入内存中的灰度颜色表 } } //图像区转换 HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeGrayBits);//分配内存 lpGrayBits = (LPSTR) ::GlobalLock(hGray);//内存数据指针 if (hGray==0) { return false; //内存分配失败则返回false } LPBYTE lpos=(LPBYTE)lpDIBBits; BYTE nGray; int x,y,z,m,pos; for( y=0; y <lpDIBHdr->biHeight; y++ ) { pos = 0; pos = y*rowLenSr; m = 0; m = y*rowLenDes; for( x=0,z=m; x <rowLenSr; x=x+3,z++) { nGray = (BYTE)( lpos[pos+x]*0.114 + lpos[pos+x+1]*0.587 + lpos[pos+x+2]*0.299); lpGrayBits[z] = (unsigned char) nGray; } } memcpy(lpGrayRgbQuag,lpGrayBits,sizeGrayBits); ::GlobalUnlock( hGray ); return TRUE; } |
24位真彩色图像转8位灰度图像
最新推荐文章于 2024-06-27 18:14:12 发布