MATLAB|GetColor 命令行版本

 

最近在后台收到私信,一些朋友说要是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/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

取色效果

11

客户端使用 例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

效果展示

11

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

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

posted @ 2022-10-10 14:33  图像处理与MATLAB  阅读(262)  评论(0)    收藏  举报