32位位图转换为8位灰度图像,调色板如何设置?
调色板写入文件以后,如何把像素的索引值对应到调色板?
如果是用LOGPALETTE实现的话,怎么用?以下附源码,生成的8位灰度图像是栅格状的,是什么原因呢?
希望高手能解答下
源码如下:
    BITMAPFILEHEADER hdr;
    BITMAPINFOHEADER bih;
    DWORD dwSize,dwWritten;
    LPBITMAPINFOHEADER pdib = (LPBITMAPINFOHEADER)lpCurrImage;//抓取的图像帧,包括位图信息头和位图数据
    BYTE* pCurrImage = lpCurrImage + *(LPDWORD)lpCurrImage;//计算位图数据的起始位置
    
    //对齐
    DWORD dwBytes = ((DWORD)pdib->biWidth * pdib->biBitCount) / 32;
    if (((DWORD) pdib->biWidth * pdib->biBitCount) % 32) 
        {
dwBytes++;
        }
    dwBytes *= 4;    //创建位图文件
    HANDLE hFile = CreateFile(szFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    if (hFile == INVALID_HANDLE_VALUE) {
    return FALSE;
}     //位图文件头初始化
    dwSize = dwBytes * pdib->biHeight / 4 + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);//抓取的图像帧的大小
    hdr.bfType     = BFT_BITMAP;
    hdr.bfSize     = dwSize + sizeof(BITMAPFILEHEADER);//位图文件的大小
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;
    hdr.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 
    256 * sizeof(RGBQUAD);     bih = * pdib;
    bih.biBitCount  = 8;     //灰度转换
    lpbNewDib = new BYTE[bih.biSizeImage];
    for (int i= 0;i < bih.biHeight; i++) 
        {
for (int j = 0;j < bih.biWidth;j++) 
    {
    lpbNewDib[j + i * bih.biWidth] = 
(BYTE)(*(pCurrImage) * 0.114 + *(pCurrImage++) * 0.587 +
*(pCurrImage++) * 0.299);
    }
        }     //调色板     
    RGBQUAD new_RGBQUAD[256];
    for( i=0;i<256;i++)
{
new_RGBQUAD[i].rgbBlue=new_RGBQUAD[i].rgbGreen=new_RGBQUAD[i].rgbRed=(BYTE)i;
new_RGBQUAD[i].rgbReserved=0;
}     WriteFile(hFile,(LPCVOID)&hdr,sizeof(BITMAPFILEHEADER),&dwWritten,0);
    WriteFile(hFile,(LPCVOID)&bih,sizeof(BITMAPINFOHEADER),&dwWritten,0);
    WriteFile(hFile,(LPCVOID)new_RGBQUAD,1024,&dwWritten,0);
    WriteFile(hFile,(LPCVOID)lpbNewDib,bih.biSizeImage,&dwWritten,0);
    
    CloseHandle(hFile);