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(); } |
接下来改造一下,把屏幕截图先转换为灰度(Gray Scale)图,再显示出来。转换灰度图的公式是,对一个RGB值,R、G、B分别是其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); |