怎么获取指定坐标的颜色值

怎么获取指定坐标的颜色值,第1张

DLL命令 取坐标颜色, 整数型, "gdi32dll", "GetPixel"

参数 设备场景, 整数型

参数 x坐标, 整数型

参数 y坐标, 整数型

DLL命令 取设备场景, 整数型, "user32dll", "GetDC", , 获取指定窗口的设备场景,出错则为0

参数 窗口的句柄, 整数型, , 将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC

版本 2

子程序 _时钟1_周期事件

局部变量 颜色值, 整数型

局部变量 红, 整数型

局部变量 绿, 整数型

局部变量 蓝, 整数型

颜色值 = 取坐标颜色 (取设备场景 (0), 取鼠标水平位置 (), 取鼠标垂直位置 ())

编辑框1内容 = 到文本 (颜色值)

看得出来你写的很乱,而且很复杂。你用CreateCompatibleBitmap创建的Bitmap,最后没使用DeleteObject释放,造成内存泄露。给你写了段程序,注释写得很清楚,应该没问题。能用结贴,最鄙视用了不结帖的。

procedure TForm1Button1Click(Sender: TObject);

var

rcScreen, rcShot: TRect; //屏幕位置, 截图位置

dcScreen, dcMem: HDC; //屏幕DC, 内存DC

bmpMem, bmpOld: HBITMAP; //新的彩色内存位图, 原始黑白内存位图

dcForm: HDC; //你用不到, 临时举例子用的

begin

rcScreenLeft := 0;

rcScreenTop := 0;

rcScreenRight := GetSystemMetrics(SM_CXSCREEN);

rcscreenBottom := GetSystemMetrics(SM_CYSCREEN);

dcScreen := GetDC(0); //取得屏幕DC

bmpMem := CreateCompatibleBitmap(dcScreen, rcScreenRight, rcScreenBottom); //创建与屏幕兼容的彩色内存位图

dcMem := CreateCompatibleDC(0); //创建内存DC

bmpOld := SelectObject(dcMem, bmpMem); //将彩色内存位图选入内存DC,同时保存原始的黑白内存位图

BitBlt(dcMem, 0, 0, rcScreenRight - rcScreenLeft, rcScreenBottom - rcScreenTop,

dcScreen, 0, 0, SRCCOPY); //将整个屏幕拷贝到内存位图

/////////////////////////////////////////////////////

//以下对比 *** 作的部分,你自己写吧,这里只是举个例子

rcShotLeft := 30;

rcShotTop := 30;

rcShotRight := 100;

rcShotBottom := 100;

dcForm := GetDC(Form1Handle);

BitBlt(dcForm, 0, 0, rcShotRight - rcShotLeft, rcShotBottom - rcShotTop,

dcMem, rcShotLeft, rcShotTop, SRCCOPY);

ReleaseDC(Form1Handle, dcForm);

/////////////////////////////////////////////////////

DeleteObject(SelectObject(dcMem, bmpOld)); //还原原始黑白内存位图,同时释放彩色内存位图

DeleteDC(dcMem); //释放内存DC

ReleaseDC(0, dcScreen); //释放屏幕DC

inherited;

end;

  if (x1/y1>x2/y2)

  {

   xDest=0;

   yDest=(y2-y1(x2/x1))/2;

   DestWidth=x2;

   DestHeight=y2-yDest;

  }

  else

  {

   xDest=(x2-x1(y2/y1))/2;

   yDest=0;

   DestWidth=x2-xDest;

   DestHeight=y2;

  }

 }

你这里的计算有问题。

第一个情况,yDest+DestHeight = y2 = wRect的高度。也就是在最下方显示了,而不是高度居中。

  if (x110/y1>x210/y2)

  {

   xDest=0;

   DestWidth=x2;

   DestHeight=y1x2/x1;

   yDest=(y2-DestHeight)/2;

  }

这样应该就对了,else自己写一下。

要显示出来,

首先就得在对话框添加一个用于显示的静态文本控件static

然后在响应鼠标移动的消息响应函数OnMouseMove中使用获取RGB颜色值的函数GetPixel ,

再分别用GetRValue,GetGValue,GetBValue三个函数获得红绿蓝三种颜色的值,最后将这三个值显示到静态文本控件上;注意,这些函数都是在鼠标移动的消息响应函数中完成;

HBITMAP holdbitmap,hbitmap;

HDC hdc,hscreendc,hmemdc;

hdc=GetWindowDC(hwnd);//获得整个hwnd指向的窗口的DC

GetWindowRect(hwnd,&rect);//获得窗口矩形

hscreendc=CreateDC("DISPLAY",NULL,NULL,NULL);//获得整个屏幕的设备DC

hmemdc=CreateCompatibleDC(hdc);//创建与设备DC兼容的内存DC

hbitmap=CreateCompatibleBitmap(hscreendc,GetDeviceCaps(hdcScreen,HORZRES),GetDeviceCaps(hdcScreen,VERTRES)); //创建与屏幕DC兼容的位图

holdbitmap=(HBITMAP)SelectObject(hmemdc,hbitmap);//将hbitmap指向的位图选入内存DC,返回值为原来的位图holdbitmap,先保存下来后面恢复

BitBlt(hmemdc,0,0,rectright-rectleft,rectbottom-recttop,hscreendc,0,0,SRCCOPY);//将设备DC的图象复制到内存DC,这样就把屏幕图象保存到hbitmap所指向的BITMAP结构体中了

点击按钮后,再用BitBlt显示出来:

case WM_COMMAND:

holdbitmap=(HBITMAP)SelectObject(hmemdc,hbitmap);//将保存图象的hbitmap选进内存DC

BitBlt(hdc,0,0,rectright-rectleft,rectbottom-recttop,hmemdc,0,0,SRCCOPY);//将内存DC的图象显示到窗口上

以上注意hbitmap变量的作用范围

以上就是关于怎么获取指定坐标的颜色值全部的内容,包括:怎么获取指定坐标的颜色值、delphi 语言拷贝DC到内存后释放的问题、MFC中关于StretchDIBits的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10065912.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存