最近在后台收到私信,一些朋友说要是GetColor
工具能提供接口供使用的话就好了。
于是,这款命令行版本的GetColor
诞生了......
对GetColor
工具感兴趣的朋友们可以查看:👉《MATLAB 取色器 —— APP 版》、《手一贱,把GetColor工具更新了》和《用Matlab搞了个小工具,以后给你女朋友的证件照换底》。
一开始,我想直接用函数封装整个过程,可以直接利用命令:
result = getcolor()
获取结果,但这样做失败了,因为在最新版本的GetColor
工具《手一贱,把GetColor工具更新了》中,我们首先启动屏幕取色程序后,鼠标移动到待取色位置,然后按下鼠标左或右键完成取色。
![4](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/4.3pb90j41xco0.gif)
实现的原理是为窗口定义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/255, 4);
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](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/1.2f0969l1jp34.gif)
客户端使用 例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 = [0, 0, 0.15*scSize(3), 0.1*scSize(4)];
uicontrol(fig, ...
'Style', 'edit', ...
'FontSize', 14, ...
'FontWeight', 'bold', ...
'Position', [10, 30, 0.1*scSize(3), 30], ...
'Tag', 'rgbText');
uicontrol(fig, ...
'Style', 'pushbutton', ...
'FontSize', 10, ...
'Position', [12+0.1*scSize(3), 30, 0.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](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/1.2f0969l1jp34.gif)
以上为GetColor
命令行版本的介绍,若有朋友有更好的开发方法,欢迎留言讨论。
对此工具GetColor
及其示例源代码感兴趣的朋友们请在**VX**公号后台回复关键词:GetColorV3
.