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)也不行,不知道是不是这里出错了~~还是其他地方也有错!!高手帮忙看下!!谢谢!