VC++MFC如何提取屏幕上每一点的RGB值并判断

VC++MFC如何提取屏幕上每一点的RGB值并判断,第1张

int nWidth=GetSystemMetrics(SM_CXSCREEN); int nHeight=GetSystemMetrics(SM_CYSCREEN); for(int i=0;i<nWidth;i++) { for(int j=0;j<nHeight;j++) { HDC hDC = ::GetDC(NULL); //获取屏幕DC //2、 获取当前鼠标位置像素值 CPoint pt; ptx=nWidth; pty=nHeight; COLORREF clr = ::GetPixel(hDC, ptx, pty); if() //你要做的判断 { } } }

TextOut(hdc,0,0,cxchar,20);

cxchar是一个int变量,不能当做字符串直接输出的,必须转换成字符串。

char ccx[20];

itoa(cxchar,ccx,10);

TextOut(hdc,0,0,ccx,strlen(ccx));

如果是使用GDI其实内核就是一个基础缩放API, StretchBlt()/StretchDIBits() GDI+的话,可以直接Draw()。

具体实现上,这要看你的应用的窗体类型。

1、DIALOG 对话框:

处理WM_CTLCOLORDLG,消息事件,先检查对话框的窗口尺寸,然后依据该尺寸创建一个兼容位图,将原图直接StretchBlt() 缩放到对话框大小,然后将这个兼容位图转换成位图画刷并返回就可以了。

2、普通的WINDOWS 窗体。

处理WM_PAINT消息。 计算窗体尺寸,然后直接使用这个API 进行缩放。 中间可以使用双缓冲,避免屏幕闪烁。

CreateDC,(CreatePrinterDC内部也是调用的它)。

CreateDC(_T("WINSPOOL"),name, NULL, data);

打印机一般用 WINSPOOL, name可以通过EnumDisplayDevices 来得到打印设备名称。data可以看MSDN上的说明来设置,也就是打印DPI,纸张宽度高度,颜色等信息,没什么难的,开始你设置为NULL试试

GetPixel(HDC,

int,

int);

是用于获取指定设备上的某一点象素的RGB颜色

HDC用于表示设备

两个int表示该点的位置坐标

查看原帖>>

CImage c;

CImage c1;

cLoad(L"e:\\heheJPG");

c1Create(……);//创建你需要的尺寸,nBPP = 24

HDC hDC = c1GetDC();

SetStrechBltMode(hDC,COLORONCOLOR);

cStrechBlt(hDC,……);//随便画吧,愿意画哪部分画哪部分

c1ReleaseDC();//这里不能少,否则会有断言错误

在MFC中,View视图类窗口的大小有两个,一个是可视窗口大小,一个是逻辑窗口大小。

在没有滚动条的情况下,两个大小相同,使用GetClientRect就可以获取大小:

CRect rt;

GetClientRect(&rt);

需要注意的是,CScrollView这个视图类,在有滚动条的情况下,通过上述代码获取的是可视窗口大小,而不是完整窗口尺寸,完整窗口尺寸需要通过GetTotalSize函数获取:

CSize logicSize = GetTotalSize();// logical size

既然用了GDI+就好办。

1VOID Example_GetPixel(HDC hdc)

{

Graphics graphics(hdc);

// Create a Bitmap object from a file

Bitmap myBitmap(L"Climberbmp");

// Get the value of a pixel from myBitmap

Color pixelColor;

myBitmapGetPixel(25, 25, &pixelColor);

int blue = pixelColorGetBlue();

}

2处理位图,三步走,先Bitmap::LockBits (),在改像素,再UnlockBits。

给个例子:

VOID Example_LockBits2(HDC hdc)

{

Graphics graphics(hdc);

UINT pixels;

// 从文件创建位图

Bitmap bitmap(L"LockBitsTest2bmp");

// 显示位图

graphicsDrawImage(&bitmap, 10, 10);

// 锁定位图中一块50x30的区域

BitmapData bitmapData;

Rect rect(20, 10, 50, 30);

bitmapLockBits(

&rect,

ImageLockModeWrite,

PixelFormat32bppARGB,

&bitmapData);

// 写入有LOckbits提供的缓冲区

pixels = (UINT)bitmapDataScan0;

for(UINT row = 0; row < 30; ++row)

{

for(UINT col = 0; col < 50; ++col)

{

pixels[row bitmapDataStride / 4 + col] = 0xff00ff00;

}

}

// 提交更改,解锁位图

bitmapUnlockBits(&bitmapData);

//显示修改后的位图

graphicsDrawImage(&bitmap, 150, 10);

}

你要在控件显示,就先获取控件的hdc,这个不要我说了吧。

以上就是关于VC++/MFC如何提取屏幕上每一点的RGB值并判断全部的内容,包括:VC++/MFC如何提取屏幕上每一点的RGB值并判断、vc++宽窄字符问题、vc中如何让背景图片随窗体的大小变化而改变 mfc等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10188974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存