GetColor 命令行版本 | MATLAB

最近在后台收到私信,一些朋友说要是GetColor工具能提供接口供使用的话就好了。

于是,这款命令行版本的GetColor诞生了......

GetColor工具感兴趣的朋友们可以查看:👉《MATLAB 取色器 —— APP 版》、《手一贱,把GetColor工具更新了》和《用Matlab搞了个小工具,以后给你女朋友的证件照换底》。

一开始,我想直接用函数封装整个过程,可以直接利用命令:

result = getcolor()

获取结果,但这样做失败了,因为在最新版本的GetColor工具《手一贱,把GetColor工具更新了》中,我们首先启动屏幕取色程序后,鼠标移动到待取色位置,然后按下鼠标左或右键完成取色。

4

实现的原理是为窗口定义WindowButtonDownFcn,它的回调函数(callback)中实现具体的取色结果,代码是这样的

fig.WindowButtonDownFcn = {@callbackFigDown, screenImage};
% callbackFigDown
function callbackFigDown(src, ~, screenImage)
    data = guidata(src);
    r = screenImage(data.CurrentImgPointY, data.CurrentImgPointX, 1);
    g = screenImage(data.CurrentImgPointY, data.CurrentImgPointX, 2);
    b = screenImage(data.CurrentImgPointY, data.CurrentImgPointX, 3);
    RGBColorValue0To255 = double([r, g, b]);
    delete(src);
end  % end function

结果存储在RGBColorValue0To255中,可是RGBColorValue0To255在回调函数,即callbackFigDown中作为返回值被调用者fig.WindowButtonDownFcn = {@callbackFigDown, screenImage};接收是不可行的。

在诸多尝试后,此法不行,果断放弃。开始了一种曲线救国的方法......

最后,还是用Handle类实现比较妥当。

方法是为我们的GetColor类定义一个事件接口GetColorChanged,并在回调函数callbackFigDown中注册,然后在客户端中监听事件接口GetColorChanged

更改后的callbackFigDown代码如下:

fig.WindowButtonDownFcn = {@obj.callbackFigDown, screenImage};
% callbackFigDown
function callbackFigDown(obj, src, ~, screenImage)
    delete(src);
    r = screenImage(obj.CurrentImgPointY, obj.CurrentImgPointX, 1);
    g = screenImage(obj.CurrentImgPointY, obj.CurrentImgPointX, 2);
    b = screenImage(obj.CurrentImgPointY, obj.CurrentImgPointX, 3);
    obj.RGBColorValue0To255 = double([r, g, b]);
    obj.RGBColorValue0To1 = round(obj.RGBColorValue0To255/2554);
    obj.HexColorValue = obj.rgbToHex();
    obj.notify('GetColorChanged');
end  % end function

那么如何在客户端中使用呢?请看下面代码:

  • Step 1. 实例化 GetColor
gc = GetColor();
  • Step 2. 监听 GetColorChanged事件接口
gc.addlistener('GetColorChanged', @updateColor);
  • Step 3. 实现 updateColor函数
% updateColor template.
function updateColor(gc, ~)
    rgbType = 'RGB';          % rgbType value: RGB(default)|rgb|hex.
    result = gc.res(rgbType)  % Obtain the result by accessing the res method.
    clipboard('copy', result);
end

需要注意的是取色结果在updateColor中由GetColor对象的res方法返回。

res方法由rgbType参数决定返回的颜色值类型: rgbType='RGB',返回[0-255]的颜色值;rgbType='rgb',返回[0-1]的颜色值;rgbType='hex',返回十六进制的颜色值。

客户端使用 例1

可以运行下面脚本,获取屏幕颜色

%GetColor   Screen color collector interface class.
%  Usage:
%  >> gc = GetColor();
%  >> gc.addlistener('GetColorChanged', @updateColor); % Need define
%  your own updateColor function.
%
%  updateColor template:
%  function updateColor(gc, ~)
%      gc.res('RGB')  % Required code! Obtain the result by accessing the res method.
%  end
%
%  Usage res method:
%  >> result = gc.res(rgbType) % rgbType value: 'RGB(default)|rgb|hex'.
%  RGB ---> [0, 255].
%  rgb ---> [0, 1].
%  hex ---> Hexadecimal color value.
%  eg.
%  >> result = gc.res('RGB') or result = gc.res()
%  >> result
%     [0 45 125].
%
%  Author:  Qingping Wangzi.
%  Date:    Oct 09, 2022.
%  Version: Matlab R2022b.
%
gc = GetColor();
gc.addlistener('GetColorChanged', @updateColor);

function updateColor(gc, ~)
rgbType = 'RGB';          % rgbType value: RGB(default)|rgb|hex.
result = gc.res(rgbType)  % Obtain the result by accessing the res method.
clipboard('copy', result);
end

取色效果

1
1

客户端使用 例2

下面的例子说明如何在GUI/APP中使用GetColor为简单起见,下面我们构建一个简易取色器:

界面中包含一个按钮,用于启动取色程序;一个文本框,用于显示取色结果(将背景颜色设置为取色结果,字体颜色为背景色的反色)。

该示例源码如下:

function testGetColorForGUI()
clear
clc
close force all

fig = figure('NumberTitle''off', ...
    'ToolBar''none', ...
    'MenuBar''none', ...
    'Name''GetColor', ...
    'Resize''off', ...
    'Visible''off');
scSize = get(0'ScreenSize');
fig.Position = [000.15*scSize(3), 0.1*scSize(4)];
uicontrol(fig, ...
    'Style''edit', ...
    'FontSize'14, ...
    'FontWeight''bold', ...
    'Position', [10300.1*scSize(3), 30], ...
    'Tag''rgbText');
uicontrol(fig, ...
    'Style''pushbutton', ...
    'FontSize'10, ...
    'Position', [12+0.1*scSize(3), 300.038*scSize(3), 30], ...
    'String''getcolor', ...
    'Tag''getColorBtn', ...
    'Callback', @callbackGetColorBtn);
movegui('center');
fig.Visible = 'on';
end  % end function

function callbackGetColorBtn(src, ~)
src.Parent.Visible = 'off';
pause(0.1)
gc = GetColor();
gc.addlistener('GetColorChanged', @updateColor);
end  % end function

function updateColor(gc, ~)
fig = gcf;
rgbText = findobj(fig, 'Tag''rgbText');
rgbType = 'RGB';          % rgbType value: RGB(default)|rgb|hex.
result = gc.res(rgbType);  % Obtain the result by accessing the res method.
rgbText.String = num2str(result);
rgbText.BackgroundColor = result/255;
rgbText.ForegroundColor = 1 - rgbText.BackgroundColor;
clipboard('copy', result);
fig.Visible = 'on';
end  % end function

效果展示

1
1

以上为GetColor命令行版本的介绍,若有朋友有更好的开发方法,欢迎留言讨论。

对此工具GetColor及其示例源代码感兴趣的朋友们请在**VX**公号后台回复关键词:GetColorV3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值