32位转8位灰度图转换有关问题~高手来帮忙!谢

32位转8位灰度图转换问题~高手来帮忙!谢!
//下面这部分是我原图的读取
void CGrayDlg::OnBtnOrigin()
{
// TODO: 在此添加控件通知处理程序代码
CRect rect;

CString OgPathName;

CFileDialog OriginDlg(TRUE);
OriginDlg.m_ofn.lpstrTitle=_T("open the original picture");
OriginDlg.m_ofn.lpstrFilter=_T("\0BMP Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0");

if(IDOK==OriginDlg.DoModal())
{
OgPathName=OriginDlg.GetPathName();
}

GetClientRect(&rect);

hbm=(HBITMAP)LoadImage(AfxGetInstanceHandle(),OgPathName,IMAGE_BITMAP,
rect.Width()/2,rect.Height()/2,LR_LOADFROMFILE);

CStatic * OriginPicture=(CStatic *)GetDlgItem(IDC_STC_ORIGIN);

OriginPicture->SetBitmap(hbm);

Invalidate();
}


//下面这部分是我原图32位转换为灰度图的程序
void CGrayDlg::OnBtnGray()
{
// TODO: 在此添加控件通知处理程序代码
HDC hDC;

HANDLE hPal;

DWORD dwSizeImage;

int dwPalette;

BITMAP bitmap;

HPALETTE hPalette;

GetObject(hbm,sizeof(bitmap),&bitmap);

dwPalette=256*sizeof(RGBQUAD);

unsigned full_size=sizeof(BITMAPINFOHEADER)+dwPalette;

BITMAPINFO *bmp = (BITMAPINFO *)new unsigned char [full_size];

bmp->bmiHeader.biBitCount=8;
bmp->bmiHeader.biClrUsed=256;
bmp->bmiHeader.biHeight=bitmap.bmHeight;
bmp->bmiHeader.biPlanes=1;
bmp->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmp->bmiHeader.biWidth=bitmap.bmWidth;
bmp->bmiHeader.biSizeImage=(bitmap.bmWidth*8+7)/8*1*bitmap.bmHeight;
bmp->bmiHeader.biCompression=BI_RGB;
bmp->bmiHeader.biClrImportant=0;

for (int i=0;i<256;i++)
{
int nGray = (bmp->bmiColors[i].rgbRed*299+
bmp->bmiColors[i].rgbGreen*587+
bmp->bmiColors[i].rgbBlue*114+500)/1000;
bmp->bmiColors[i].rgbBlue=nGray;
bmp->bmiColors[i].rgbGreen=nGray;
bmp->bmiColors[i].rgbRed=nGray;
bmp->bmiColors[i].rgbReserved=0;
}

hPal=GetStockObject(dwPalette);
if(hPal)
{
hDC=::GetDC(NULL);
hPalette=SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
}

GetDIBits(hDC,hbm,0,bitmap.bmHeight,
bmp+sizeof(BITMAPINFO),bmp,DIB_RGB_COLORS);

if (hPalette)
{
SelectPalette(hDC,hPalette,TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
}

CStatic * stc=(CStatic*)GetDlgItem(IDC_STC_GRAY);

stc->SetBitmap(hbm);

Invalidate();
}

我是在一个dialog里面弄了2个picture control!一个为原图读取,一个为灰度转换,我不知道前面的定义对不对,读取那部分就不用看啦,说明下而已!
帮我看下灰度图转换的那部分,看下编程得对不对,还有我就不懂这里hPal=GetStockObject(dwPalette);要怎么去编!里面的参数是int,原本我给了default_palette,可以编译成功,但是颜色还是很原图一样没变,就去网上查了这个参数,发现原来这个参数是缺省调色板,但我现在是8位的啦~~应该有调色板啦~~所以我就把里面改成256也不行,改成256*sizeof(rgbquad)也不行,不知道是不是这里出错了~~还是其他地方也有错!!高手帮忙看下!!谢谢!

------解决方案--------------------
灰度化算法网上很多,回贴也是给粘贴,自己百度一下,找个合适的,试一下就好

先百度24位 位图灰度化 (这个相对复杂,是基本功范围,且通用)

再自己找出32位和24位的对应关系,就可以了(这个简单,因为有1个位直接舍去就可以了)
------解决方案--------------------
32位只是多了个Alpha 而已