19,472
社区成员




void ColorToGray(LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
ASSERT(lpDIB!=NULL);
// 图像每行的字节数
LONG lLineBytes=WIDTHBYTES(lWidth*8);
BYTE rgbBlue(0);
BYTE rgbGreen(0);
BYTE rgbRed(0);
// 真彩色图像变成灰度图像
if (DIBNumColors(lpDIB) == 0)
{
// 位图信息头
LPBITMAPINFOHEADER lpBI = (LPBITMAPINFOHEADER)lpDIB;
lpBI->biSize = 40;
lpBI->biWidth = lWidth;
lpBI->biHeight = lHeight;
lpBI->biPlanes = 1;
lpBI->biBitCount = 8;
lpBI->biCompression = 0;
lpBI->biSizeImage = lLineBytes*lHeight;
lpBI->biClrUsed = 0;
lpBI->biClrImportant = 0;
// DIB图像数据
LPBYTE lpDIBBits=LPBYTE(lpDIB+(DWORD)(*lpDIB));
LPBYTE lpdesc=new BYTE[lLineBytes*lHeight];
LONG i,j;
for (j=0; j<lHeight; j++)
{
for (i=0; i<lWidth; i++)
{
rgbBlue = *(lpDIBBits+lLineBytes*j*3+i*3);
rgbGreen = *(lpDIBBits+lLineBytes*j*3+i*3+1);
rgbRed = *(lpDIBBits+lLineBytes*j*3+i*3+2);
lpdesc[lWidth*j+i]= (BYTE)(0.299*rgbRed+0.587*rgbGreen+0.114*rgbBlue+0.5);
}
}
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
*(lpDIBBits+sizeof(RGBQUAD)*256+lLineBytes*i+j)= lpdesc[lWidth*i+j];
}
}
delete [] lpdesc;
// 添加调色板
LPBITMAPINFO lpbmi = (LPBITMAPINFO)lpDIB;
LPBITMAPCOREINFO lpbmc = (LPBITMAPCOREINFO)lpDIB;
int k=0;
if(IS_WIN30_DIB(lpDIB))
{
for (k=0; k<256; k++)
{
lpbmi->bmiColors[k].rgbRed=(BYTE)k;
lpbmi->bmiColors[k].rgbGreen=(BYTE)k;
lpbmi->bmiColors[k].rgbBlue=(BYTE)k;
lpbmi->bmiColors[k].rgbReserved=0;
}
}
else
{
for (k=0; k<256; k++)
{
lpbmc->bmciColors[k].rgbtRed=(BYTE)k;
lpbmc->bmciColors[k].rgbtGreen=(BYTE)k;
lpbmc->bmciColors[k].rgbtBlue=(BYTE)k;
}
}
}
}