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

chenloveheimei 2012-05-05 09:43:46
//下面这部分是我原图的读取
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)也不行,不知道是不是这里出错了~~还是其他地方也有错!!高手帮忙看下!!谢谢!
...全文
309 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
觅食的猫猫 2012-05-08
  • 打赏
  • 举报
回复
调色板是1024个字节
chenloveheimei 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

一定要自己做么?
OpenCV一个函数搞定
[/Quote]

我知道哈~~我同事都跟我说了opencv一个函数就搞定啦!!但我就想了解他的内部运作哈!!好比30*50=1500是吧!!那总不能老师说,你就只要知道30*50等于1500就行了!!但我从来都不知道30*50里面是怎么运作的!!对吧!!其实~~自从我看了深入浅出~~我就魔化了!!中了JJ Hou的毒了!hoho!!
所以!!一定要自己做!!
WJN92 2012-05-05
  • 打赏
  • 举报
回复
32位只是多了个Alpha 而已
向立天 2012-05-05
  • 打赏
  • 举报
回复
一定要自己做么?
OpenCV一个函数搞定
百事烟 2012-05-05
  • 打赏
  • 举报
回复
灰度化算法网上很多,回贴也是给粘贴,自己百度一下,找个合适的,试一下就好

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

再自己找出32位和24位的对应关系,就可以了(这个简单,因为有1个位直接舍去就可以了)
chenloveheimei 2012-05-05
  • 打赏
  • 举报
回复
来人哪~~第一次开贴也是我自己顶,第二次开贴也是我自己顶!!肿么回事哈~~种马就木有人来我这捏?来人哪!!
chenloveheimei 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

JJ Hou 的深入浅出确实魔化人心。
搞研发确实需要深入了解内部机制
[/Quote]
那你觉得是好还是坏呢?既然魔化,那要沉沦还是觉醒呢?楼上的仁兄也说了~~我也觉得~~在工作上确实是浪费了点时间!!因为我毕竟不是专研的!!
chenloveheimei 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

引用 3 楼 的回复:

一定要自己做么?
OpenCV一个函数搞定


我知道哈~~我同事都跟我说了opencv一个函数就搞定啦!!但我就想了解他的内部运作哈!!好比30*50=1500是吧!!那总不能老师说,你就只要知道30*50等于1500就行了!!但我从来都不知道30*50里面是怎么运作的!!对吧!!其实~~自从我看了深入浅出~~我就魔化了!……
[/Quote]

呵呵~~我懂!!这确实是有点盲目和浪费时间和固执,但是总觉得如果不去看懂,学习这些有什么用,虽然看透了和money挂不上钩,但总是会有点遗憾,好的!!我明白啦!!工作归工作,课后归课后,课后想怎么去解剖再去解剖~~也谢谢你的帮忙啦!!
一袭白衣 2012-05-05
  • 打赏
  • 举报
回复
JJ Hou 的深入浅出确实魔化人心。
搞研发确实需要深入了解内部机制
向立天 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

一定要自己做么?
OpenCV一个函数搞定


我知道哈~~我同事都跟我说了opencv一个函数就搞定啦!!但我就想了解他的内部运作哈!!好比30*50=1500是吧!!那总不能老师说,你就只要知道30*50等于1500就行了!!但我从来都不知道30*50里面是怎么运作的!!对吧!!其实~~自从我看了深入浅出~~我就魔化了!!中了JJ Hou的毒了!hoh……
[/Quote]从学习和研究的角度我同意是的说法
不过从工作和应用的角度我觉得大可不必
如果你不是专职做相关研究的我觉得你就是在浪费时间
不过精神可加吧
OpenCV开源
你可以去看看源码

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧