彩色图像灰度处理 我前几天刚写了个这个程序,我的做法是生成一个新的DIB,新DIB是256色,每色的R,G,B都是相同的,并且和它们的索引值相同,进行灰度变换时直接把新DIB的每个点数据(8位索引)设置成灰度值。不知道我说的够清楚不? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充下上面的“新DIB是256色,每色的R,G,B都是相同的,并且和它们的索引值相同”指的是调色版;另DIB本身不支持灰度图,还有一种比较简单的算法就是把调色版的颜色进行灰度变换,但是新DIB和源DIB同大小 但图像大小并没变成彩色图的1/3那是因为你的变更后的图像实际上还是24位的。只是他们的R/G/B分量相同而已 先创建8位的DIB,设置其调色板(这一定要做),然后就是根据彩色图像像这个8位DIB写数据了啊! 楼住可以看下我的代码 中间有一些函数是自己写的,不过不影响算法,主要的一个是上面部分的生成调色版,一个是下面的循环做灰度变换CDib* CDib::GetGrayDib(double dRedWeight,double dGreenWeight,double dBlueWeight){ HDIB hNewDib=CreateDIB(m_nWidth,m_nHeight,8);//创建新的DIB LPBITMAPINFO lpNewDib=(LPBITMAPINFO)GlobalLock(hNewDib); //设置灰度图的Palette for(int i=0;i<256;i++) { lpNewDib->bmiColors[i].rgbBlue= lpNewDib->bmiColors[i].rgbGreen= lpNewDib->bmiColors[i].rgbRed=BYTE(i); } CDib* pNewDib=new CDib; if(NULL==pNewDib)return NULL; pNewDib->Create((LPBYTE)lpNewDib); GlobalUnlock(hNewDib); GlobalFree(hNewDib); pNewDib->UpdateInternal(); COLORREF cColor; BYTE* lPixel; SetDibPtrBegin(this); SetDibPtrBegin(pNewDib); for(UINT nHeight=0;nHeight<m_nHeight;nHeight++) { for(UINT nWidth=0;nWidth<m_nWidth;nWidth++) { cColor=GetPixel(nWidth,nHeight); lPixel=(BYTE*)(pNewDib->m_lpData+pNewDib->GetPixelOffset(nWidth,nHeight)); (*lPixel)=(BYTE)(GetRValue(cColor)*dRedWeight+ GetGValue(cColor)*dGreenWeight+ GetBValue(cColor)*dBlueWeight); } } SetDibPtrEnd(pNewDib); SetDibPtrEnd(this); pNewDib->UpdateInternal(); return pNewDib;} VC6.0中Edit控件保存数据 有人能解决这个文件操作的两个问题吗??100分等着送给你! MFC的映射类可以动态增长吗? 请教:如何去掉单文档程序中的菜单栏,(内空)多谢告知 大侠们请帮忙::有谁知道怎样列举系统中的进程吗? 怎样将DLL中资源导出??? 一个有滚动条的窗体里如何自动翻页?如何得到程序执行目录? 对话框的背景色想改成蓝色渐变的那种应该如何做 True的问题! 内存占用2个多G,导致崩溃,用什么办法能有效查出内存浪费在哪里了? VC++6.0有没有过时呀,现在学是不是落后时代了? 引用DLL中线程问题
另DIB本身不支持灰度图,还有一种比较简单的算法就是把调色版的颜色进行灰度变换,但是新DIB和源DIB同大小
那是因为你的变更后的图像实际上还是24位的。只是他们的R/G/B分量相同而已
CDib* CDib::GetGrayDib(double dRedWeight,double dGreenWeight,double dBlueWeight)
{
HDIB hNewDib=CreateDIB(m_nWidth,m_nHeight,8);//创建新的DIB
LPBITMAPINFO lpNewDib=(LPBITMAPINFO)GlobalLock(hNewDib); //设置灰度图的Palette for(int i=0;i<256;i++)
{
lpNewDib->bmiColors[i].rgbBlue=
lpNewDib->bmiColors[i].rgbGreen=
lpNewDib->bmiColors[i].rgbRed=BYTE(i);
} CDib* pNewDib=new CDib;
if(NULL==pNewDib)return NULL;
pNewDib->Create((LPBYTE)lpNewDib);
GlobalUnlock(hNewDib);
GlobalFree(hNewDib);
pNewDib->UpdateInternal();
COLORREF cColor;
BYTE* lPixel;
SetDibPtrBegin(this);
SetDibPtrBegin(pNewDib);
for(UINT nHeight=0;nHeight<m_nHeight;nHeight++)
{
for(UINT nWidth=0;nWidth<m_nWidth;nWidth++)
{
cColor=GetPixel(nWidth,nHeight);
lPixel=(BYTE*)(pNewDib->m_lpData+pNewDib->GetPixelOffset(nWidth,nHeight));
(*lPixel)=(BYTE)(GetRValue(cColor)*dRedWeight+
GetGValue(cColor)*dGreenWeight+
GetBValue(cColor)*dBlueWeight);
}
}
SetDibPtrEnd(pNewDib);
SetDibPtrEnd(this);
pNewDib->UpdateInternal();
return pNewDib;
}