MFC下截屏 & 灰度显示

PomeloWu原作,转载请指明出处用MFC很容易把当前屏幕截取,并显示在自己程序的UI上。以对话框为例,在执行绘制的单元(比如OnPaint)中调用下面这个函数就能做到: BOOL CSrnShotDlg::GetMyScreen(                   CDC *pdc                                      // 目
摘要由CSDN通过智能技术生成

PomeloWu原作,转载请指明出处

用MFC很容易把当前屏幕截取,并显示在自己程序的UI上。以对话框为例,在执行绘制的单元(比如OnPaint)中调用下面这个函数就能做到:

 

BOOL CSrnShotDlg::GetMyScreen(

                   CDC *pdc                                      // 目标DC

)

{

                   CDC dc;

                   dc.CreateDC("DISPLAY", NULL, NULL, NULL); // 屏幕DC

 

                   CRect clientRect;

                   GetClientRect(clientRect);                                           // 对话框矩形区域

 

                   pdc->BitBlt(0, 0,                                                             // 起始位置

                                     clientRect.Width(),clientRect.Height(),    // 宽高

                                     &dc,                                                                 // CDC对象

                                     0, 0,                                                                    // 源位置

                                     SRCCOPY                                                       // 复制方法

                                     );

                   dc.DeleteDC();
                   return TRUE;

}

 

接下来改造一下,把屏幕截图先转换为灰度(Gray Scale)图,再显示出来。转换灰度图的公式是,对一个RGB值,RGB分别是其3色分量,计算:

              Gray = R * 0.299 + G *0.587 + B * 0.114

然后将Gray分别替换掉原来的3色分量。到这个地方,很自然想到用SetPixel/GetPixel来实现。因为要对DC进行操作,当然就不能直接在上面GetMyScreen里边的dc直接操作了,为此对GetMyScreen进行一下改造,并且,为了程序的可读性,增加一个ConvertToGray函数负责转换(与上面代码不同的地方用红色区分)

 

void ConvertToGray (CDC * pdc)

{

                   for (int xx = 0; xx < clientRect.right ; xx ++)

                                     for (int yy = 0; yy < clientRect.bottom ; yy ++)

                                     {

                                                        COLORREF crTemp = pdc->GetPixel(xx,yy);

                                                        BYTE pixelR = GetRValue(crTemp);

                                                        BYTE pixelG = GetGValue(crTemp);

                                                        BYTE pixelB = GetBValue(crTemp);

                                                        BYTE gray = (BYTE) (pixelR * 0.299 + pixelG * 0.587 +pixelB * 0.114);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值