19,468
社区成员
发帖
与我相关
我的任务
分享
BOOL CDibImage::ColorToGray(LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
// 找到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;
if(24==lpDIBHdr->biBitCount) //24位真彩色转256色灰度图
{
// 创建灰度图的颜色表
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;
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 );
}
if(32==lpDIBHdr->biBitCount) //32位真彩色转256色灰度图
{
// 创建灰度图的颜色表
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpDIB+lpDIBHdr->biSize);//指向内存中的灰度颜色表
int rowLenSr=WIDTHBYTES(32*lpDIBHdr->biWidth);//行字节数
int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
int sizeGrayBits=rowLenDes*lpDIBHdr->biHeight;
int i;
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+4,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;
}