129上位机VC MFC获取图片任意位图的颜色值
129上位机VC MFC获取图片任意位图的颜色值
功能展示
一幅图片,不同位置上的颜色各有不同不如何获取图片上任意位置的颜色值?我们当前例程实现了这一功能,当鼠标移动到位图上,鼠标侧边显示颜色值,且将颜色直充到右侧矩形中,效果如图; 要点提示 图片的获取,首先要获取鼠标所在窗口的CDC设备上下文,然后通过此类的函数GetPixel便可快速获取, RGB的各个值可以通过GetRValue()GetGValue() GetBValue()三个函数分别获取;
实现功能 1.新建基于对话框的应用程序 2.给工程加入一位图,用于测试用; 添加一图片控件,修改下默认ID为IDC_BMP,设置其类型为位图,位图ID为我们添加的位图ID; 添加一图片控件,修改下默认ID为IDC_COLOR用于显示获取的颜色效果; 添加一文本控件,修改下默认ID为IDC_TEXT,用于显示获取颜色的RGB值;
3.添加鼠标移动消息,实现颜色的获取与显示 - void CGkbc8Dlg::OnMouseMove(UINT nFlags, CPoint point)
- {
- CDialog::OnMouseMove(nFlags, point);
- if(GetDlgItem(IDC_BMP) == ChildWindowFromPoint(point))
- {
- CDC* pDC = GetDlgItem(IDC_BMP)->GetDC();
- MapWindowPoints(GetDlgItem(IDC_BMP),&point,1);//坐标点转换为控件上坐标
- COLORREF Color;
- Color = pDC->GetPixel(point);//获取控件上点point的颜色值
-
- int r,g,b;
- r = GetRValue(Color);
- g = GetGValue(Color);
- b = GetBValue(Color);
复制代码- CString sText;
- sText.Format("R:%d,G:%d,B:%d",r,g,b);
- CDC *pDCText = GetDlgItem(IDC_TEXT)->GetDC();
- CSize sz = pDCText->GetTextExtent(sText);
- GetDlgItem(IDC_TEXT)->SetWindowText(sText);
- GetDlgItem(IDC_TEXT)->SetWindowPos(&wndTop ,point.x+20,point.y+20,sz.cx,sz.cy,
- SWP_SHOWWINDOW);
- //>< 填充矩形
- CRect rc;
- GetDlgItem(IDC_COLOR)->GetClientRect(rc);
- CDC* pDCColor = GetDlgItem(IDC_COLOR)->GetDC();
- CBrush Brush(RGB(r,g,b));
- pDCColor->FillRect(rc,&Brush);
- //
- GetDlgItem(IDC_COLOR)->ReleaseDC(pDCColor);
- GetDlgItem(IDC_BMP)->ReleaseDC(pDC);
- GetDlgItem(IDC_TEXT)->ReleaseDC(pDCText);
- }
- else
- GetDlgItem(IDC_TEXT)->ShowWindow(SW_HIDE);//隐藏文本窗口
- }
复制代码我们来演示下功能实现的整个过程
|