社区
Delphi
帖子详情
怎样从一幅图片中取色,就想“画板”中的“吸管”功能?up有分!
ocool
2002-10-05 05:41:25
怎样从一幅图片中取色,就想“画板”中的“吸管”功能?up有分!
...全文
668
4
打赏
收藏
怎样从一幅图片中取色,就想“画板”中的“吸管”功能?up有分!
怎样从一幅图片中取色,就想“画板”中的“吸管”功能?up有分!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
vvv_for_ever
2002-10-05
打赏
举报
回复
先获得该图片的上下文(也就是DC),再调用windows API函数,具体师那个函数我记不清了,你可以看看msdn。
lovedata
2002-10-05
打赏
举报
回复
没做过这种东西,但是给你找到了一篇文章,是从“程序员大本营”里找的,看看吧。
用Delphi获取任意一点颜色值
大家或许都曾遇到过这样的情况:发现一幅图片或者某个图标上有一种你很喜欢的颜色,但你却无法用其它软件得到该颜色的RGB颜色值。其实如果你懂得一点Delphi的编程知识,要实现这一功能很简单。
在Delphi中调用WMEraseBkng()结合canvas对象中的“点”操作——pixels[x,y],便可以轻松得到屏幕上点坐标的颜色值,其具体原理是这样的:
1、将屏幕作为窗体(Form)的画布属性,即定义函数:
procedure WMEraseBkng(var MSg:TWMEraseBkgnd);message WM_ERASEBKGND;
在函数体中加入“Msg.Result:=1”便可实现此功能;
2、获取任一点的颜色值。在Delphi4.0中画布(Tcanvas)既是对象的属性,同时画布也是一个对象,画布可依附在其它对象中,画布Tcanvas只有在其它对象运行时才可用。由于已将屏幕抓取为窗体的画布,所以通过窗体画布的pixels属性便可准确获取相应点的颜色值。
由以上原理,我们可以编一个提取窗体任一点颜色代码的小程序(如图1),在Delphi中新建两个窗体,其中一个窗体(scrback)用来做屏幕画布,此窗体无需添加任何对象;另一个窗体(mainfrm)用来显示颜色和坐标信息,其中Label1用来显示当前颜色,Label2用来显示点击点颜色的十六进制RGB组合颜色值,mouseX、mouseY用来显示指针在屏幕上的坐标值,red、green、blue用来显示相应红、绿、蓝三分量的十进制数值;创建一个Tbutton1用来退出程序。
以下是画布窗口完整代码(scrback.pas):
unit scrback;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
type
Tscrcolor = class(TForm)
procedure FormClick(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormResize(Sender: TObject);
private
scrx,scry : integer;
{获取当前坐标}
temp : tcolor;
procedure WMEraseBkng(var MSg:TWMEraseBkgnd);
message WM_ERASEBKGND;
public
{ Public declarations }
end;
var
scrcolor: Tscrcolor;
implementation
uses mainfrm;
{由于TLabel均在另一个窗体中,因此必须用“uses”进行声明}
{$R *.DFM}
const
Digits : array[0..$F] of Char = '0123456789ABCDEF';
{由于获取颜色值不是十六进制数,因此需用数组存储十六进制字符}
procedure Tscrcolor.WMEraseBkng(var MSg:TWMEraseBkgnd);
begin
Msg.Result:=1;
end;
{用函数实现将屏幕画面载入窗体}
procedure Tscrcolor.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
scrx := x;
scry := y;
temp := canvas.pixels[scrx,scry];
{获取相应点颜色值}
form1.label2.COLOR := temp;
{将Label2的颜色设置为鼠标所在点的颜色}
form1.mouseX.Caption := inttostr(x);
form1.mouseY.Caption := inttostr(y);
{显示当前坐标}
end;
procedure Tscrcolor.FormClick(Sender: TObject);
var
rr,gg,bb : byte;
begin
rr := getRvalue(temp); {分解红色分量}
gg := getGvalue(temp); {分解绿色分量}
bb := getBvalue(temp); {分解蓝色分量}
form1.label1.Caption := “#” + Digits[rr shr 4] + Digits[rr and $F] + Digits[gg shr 4] + Digits[gg and $F] + Digits[bb shr 4] + Digits[bb and $F];{显示相应十六进制数值}
form1.red.Caption := “红:” + inttostr((rr shr 4)*16 + (rr and $F));
{显示十进制红色分量}
form1.green.Caption :=“绿:” + inttostr((gg shr 4)*16 + (gg and $F));
{显示十进制绿色分量}
form1.blue.Caption :=“蓝:” + inttostr((bb shr 4)*16 + (bb and $F));
{显示十进制蓝色分量}
end;
procedure Tscrcolor.FormResize(Sender: TObject);
begin
form1.Show;
end;
{在窗体转变时调用显示窗口}
end.
以下是显示窗口完整代码(mainfrm.pas):
unit mainfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
{建立一个显示区}
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
mouseX: TLabel;
{用来显示鼠标X坐标}
mouseY: TLabel;
{用来显示鼠标Y坐标}
red: TLabel;
{用来显示红色颜色值}
green: TLabel;
{用来显示绿色颜色值}
blue: TLabel;
{用来显示蓝色颜色值}
Button1: TButton;
{用来退出程序}
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses scrback;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
scrcolor.Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
scrcolor.Close;
end;
{以上两个事件均为退出程序}
end.
对于窗体有几点说明:首先,屏幕窗体的AutoSize属性必须关闭(False),同时将窗体边界(BorderStyle)设置为“无”(bsNone);其次,显示窗体的FormStyle属性必须设为fsStayOnTop(始终处于最上层),只是为了防止在点击画布窗体后,显示窗口因失去焦点而无法控制程序;再次,需将屏幕窗体的窗体状态(WindowState)设置为“最大化”(wsMaximized),以便在该窗体创建过程中产生一个FormResize事件;最后还应注意,两个窗体的调用顺序,必须将画布窗体设定为程序的主调窗体,通过画布窗体来调用显示窗体,这样才可以将屏幕完整的地取为画布。
以上介绍的这个小程序就其自身的价值而言是微不足道的,但通过对这个小程序的扩展,我们能实现屏幕保护、屏幕抓图等功能;如将一些系统键屏蔽掉,并加入密码校验窗口,还可实现系统暂时保护,(比如你暂时离开,却又不想别人乱动你的东西……)由于篇幅有限,在此不再详述。(常州 任毅)
Wnyu
2002-10-05
打赏
举报
回复
Up!
同意樓上!
ehom
2002-10-05
打赏
举报
回复
Color:=MainImage.Picture.Bitmap.Canvas.Pixels[X,Y]
完整的安卓
画板
源代码 Android小
画板
实现了
画板
的各种
功能
,网上找的,共享了。
[开源][安卓]
功能
齐全的涂鸦软件WTest
[开源][安卓]
功能
齐全的涂鸦软件WTest
几何
画板
是哪方面的计算机应用,几何
画板
主要
功能
是哪些?了解后就能愉快使用啦...
几何
画板
是款适用于教育行业...几何
画板
界面及
功能
体现几何
画板
功能
主要体现在以下方面:一 画线、画圆工具几何
画板
在图形绘制上比一般的绘图软件更为精准,更符合数学的严格要求。线可分为线段、射线和直线;圆为正...
怎么在几何
画板
中
导入
图片
把所需的
图片
复制到Windows的剪贴板上,再利用几何
画板
中
“编辑”菜单
中
的“粘贴
图片
”命令直接导入
一幅
图片
到课件
中
;或者右键单击
画板
中
空白处,粘贴
图片
。 在“编辑”菜单下选择“粘贴
图片
”命令 二、直接将...
windows
取色
器(吸取颜色,获取颜色的rgb信息)
有时候我们需要取屏幕
中
某个物体或者某个像素的颜色,如何做呢? 可以使用windows自带
画板
的
取色
器 先在桌面上右键新建图像 然后以画图打开这张
图片
然后将需要
取色
的部分截一张图,复制到
画板
上(截图应该知道...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章