您的位置:首页 > 其它

彩色图像转灰度图像

2009-10-17 09:22 260 查看
09:34:57 2009-10-17

注意:我们并不是把真彩图像真正转为8位灰度图像,而是将其r、g、b值转为相等的对应灰度值,看起来就是灰度图像了,

先要在相应的头文件中定义一个宏

#define RGB2GRAY(r,g,b) (((b)*117 + (g)*601 + (r)*306) >> 10)

void CDIPDoc::OnGrayscale()
{
if (!image)
return;
if(image->GetBPP()< 24)
{
CString strMessage;
strMessage = "只支持真彩图!";
AfxMessageBox(strMessage);
return;
}

for(int y=0;y<image->GetHeight();y++)//遍历图像
{
for(int x=0;x<image->GetWidth();x++)
{
// COLORREF是windows中定义的用于存放颜色值的32位变量类型,
// 低8位为红色值,再上面是8位绿色值和8位蓝色值,最高8位保留(可用于表示透明度)

// RGB是windows已定义的宏,用于将r、g、b值组合为COLORREF量
// 我们并不是把真彩图像真正转为8位灰度图像,
// 而是将其r、g、b值转为相等的对应灰度值,看起来就是灰度图像了

COLORREF rgb = image->GetPixel(x,y);// GetPixel用于取坐标为(x,y)的像素的rgb值;
// RGB2GRAY为我们之前定义的宏
// GetRValue,GetGValue和GetBValue为windows已定义的宏,分别用于从COLORREF变量中取红、绿、蓝值
BYTE gray = RGB2GRAY(GetRValue(rgb),GetGValue(rgb),GetBValue(rgb));
rgb = RGB(gray,gray,gray);//r,g,b值相等时没有颜色(即灰色)
image->SetPixel(x,y,rgb);//设置像素值

}
}
CString strMessage;
strMessage = "处理成功!";
AfxMessageBox(strMessage);

UpdateAllViews(NULL,NULL);
}


下面是稍作改进的代码,避免了多次调用系统定义的宏命令

void CDIPDoc::OnGrayscale()
{
if (!image)
return;
if(image->GetBPP()< 24)
{
CString strMessage;
strMessage = "只支持真彩图!";
AfxMessageBox(strMessage);
return;
}

for(int y=0;y<image->GetHeight();y++)//遍历图像
{
for(int x=0;x<image->GetWidth();x++)
{
// GetPixelAddress为取当前像素地址
BYTE *pixel = (BYTE*)image->GetPixelAddress(i,j);
// 取当前像素r、g、b值,注意顺序
BYTE blue = *pixel++;
BYTE green = *pixel++;
BYTE red = *pixel;

// 转为灰度
BYTE gray = RGB2GRAY(red,green,blue);
// 设置新的r、g、b值
*pixel = gray;
pixel--;
*pixel = gray;
pixel--;
*pixel = gray;

}
}
CString strMessage;
strMessage = "处理成功!";
AfxMessageBox(strMessage);

UpdateAllViews(NULL,NULL);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: