[MATLAB GUI]多功能均匀离散型调色板的开发笔记

首先说一下,我只是非计算机专业的大二学生,没有系统性的学习过相关知识,都是靠社区大佬的博客一点点找着写出来,第一次写出一个像样的程序,还请各位多多包涵,如果有错误、需要优化的地方,还请多多指教。

先来说一下这个程序的基本功能。

一,左侧调色板

左侧调色板:需要在rgb三个模式下形成不同的色板,而且不是单向的渐变,我选择计算每个点的像素值然后用imshow显示出来,引用全局变量‘colormode’判断当前颜色模式。

axes(handles.axes2);
cla reset;
space=handles.spacecode;
switch space
    case 1
sr=get(handles.rgb_r,'string');
r=str2num(sr);
A=zeros(256,256,3,"uint8"); 
for m=1:1:256
    for n=1:1:256
A(m,n,1)=r; 
A(m,n,2)=256-m; 
A(m,n,3)=n; 
    end
end
imshow(A);
hold on;

    case 2
sg=get(handles.rgb_g,'string');
g=str2num(sg);
A=zeros(256,256,3,"uint8"); 
for m=1:1:256
    for n=1:1:256
A(m,n,1)=256-m; 
A(m,n,2)=g; 
A(m,n,3)=n; 
    end
end
imshow(A);
hold on;

    case 3
sb=get(handles.rgb_b,'string');
b=str2num(sb);
A=zeros(256,256,3,"uint8"); 
for m=1:1:256
    for n=1:1:256
A(m,n,1)=n; 
A(m,n,2)=256-m; 
A(m,n,3)=b; 
    end
end
imshow(A);
hold on;
end

左侧调色板的colorbar,为了满足可以点击然后得到相应值的功能,我没有用colorbar直接生成,而是单独生成了一个axes,根据不同颜色模式转换并等待bottoncall返回y轴的值。

生成字段:

axes(handles.axes1);
set(gca,'XColor',get(gca,'Color')) ;
set(gca,'XTickLabel',[]);
map=zeros(256,3);
space=handles.spacecode;
switch space
    case 1
for i=0:1:255
map(i+1,1)=i/255;
end
for i=1:1:3
map(r+1,i)=1;
end
    case 2
for i=0:1:255
map(i+1,2)=i/255;
end
for i=1:1:3
map(g+1,i)=1;
end
    case 3
for i=0:1:255
map(i+1,3)=i/255;
end
for i=1:1:3
map(b+1,i)=1;
end
end
colormap(map);
x = [0 1 1 0];
y = [0 0 255 255];
c = [0; 0; 768; 768];
patch(x,y,c);
hold on;

buttoncall:

axes(handles.axes1);
pos = get(handles.axes1,'Currentpoint');
m=pos(1,2);
m=fix(m);
if m>255
    m=255;
end
if m<0
    m=0;
end
space=handles.spacecode;

右侧颜色各个参数,在callback里面分别计算显示。

二,均匀调色板

均匀调色板:

 因为需要点击一个色块使得切换成当前色块的颜色到新的颜色中,所以axes绘图然后调成点击的坐标然后输出值这种方式会很麻烦,我的想法是直接创建25个botton,通过改变它的backgroundcolor实现均匀调色的目的。

生成过程:

space=handles.spacecode;
switch space
    case 1
set(handles.t1_1,'backgroundcolor',[r/255 (g+2*tap)/255 (b-2*tap)/255]);
set(handles.t1_2,'backgroundcolor',[r/255 (g+2*tap)/255 (b-tap)/255]);
set(handles.t1_3,'backgroundcolor',[r/255 (g+2*tap)/255 b/255]);
set(handles.t1_4,'backgroundcolor',[r/255 (g+2*tap)/255 (b+tap)/255]);
set(handles.t1_5,'backgroundcolor',[r/255 (g+2*tap)/255 (b+2*tap)/255]);
set(handles.t2_1,'backgroundcolor',[r/255 (g+tap)/255 (b-2*tap)/255]);
set(handles.t2_2,'backgroundcolor',[r/255 (g+tap)/255 (b-tap)/255]);
set(handles.t2_3,'backgroundcolor',[r/255 (g+tap)/255 b/255]);
set(handles.t2_4,'backgroundcolor',[r/255 (g+tap)/255 (b+tap)/255]);
set(handles.t2_5,'backgroundcolor',[r/255 (g+tap)/255 (b+2*tap)/255]);
set(handles.t3_1,'backgroundcolor',[r/255 g/255 (b-2*tap)/255]);
set(handles.t3_2,'backgroundcolor',[r/255 g/255 (b-tap)/255]);
set(handles.t3_3,'backgroundcolor',[r/255 g/255 b/255]);
set(handles.t3_4,'backgroundcolor',[r/255 g/255 (b+tap)/255]);
set(handles.t3_5,'backgroundcolor',[r/255 g/255 (b+2*tap)/255]);
set(handles.t4_1,'backgroundcolor',[r/255 (g-tap)/255 (b-2*tap)/255]);
set(handles.t4_2,'backgroundcolor',[r/255 (g-tap)/255 (b-tap)/255]);
set(handles.t4_3,'backgroundcolor',[r/255 (g-tap)/255 b/255]);
set(handles.t4_4,'backgroundcolor',[r/255 (g-tap)/255 (b+tap)/255]);
set(handles.t4_5,'backgroundcolor',[r/255 (g-tap)/255 (b+2*tap)/255]);
set(handles.t5_1,'backgroundcolor',[r/255 (g-2*tap)/255 (b-2*tap)/255]);
set(handles.t5_2,'backgroundcolor',[r/255 (g-2*tap)/255 (b-tap)/255]);
set(handles.t5_3,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
set(handles.t5_4,'backgroundcolor',[r/255 (g-2*tap)/255 (b+tap)/255]);
set(handles.t5_5,'backgroundcolor',[r/255 (g-2*tap)/255 (b+2*tap)/255]);
 case 2
set(handles.t1_1,'backgroundcolor',[(r+2*tap)/255 g/255 (b-2*tap)/255]);
set(handles.t1_2,'backgroundcolor',[(r+2*tap)/255 g/255 (b-tap)/255]);
set(handles.t1_3,'backgroundcolor',[(r+2*tap)/255 g/255 b/255]);
set(handles.t1_4,'backgroundcolor',[(r+2*tap)/255 g/255 (b+tap)/255]);
set(handles.t1_5,'backgroundcolor',[(r+2*tap)/255 g/255 (b+2*tap)/255]);
set(handles.t2_1,'backgroundcolor',[(r+tap)/255 g/255 (b-2*tap)/255]);
set(handles.t2_2,'backgroundcolor',[(r+tap)/255 g/255 (b-tap)/255]);
set(handles.t2_3,'backgroundcolor',[(r+tap)/255 g/255 b/255]);
set(handles.t2_4,'backgroundcolor',[(r+tap)/255 g/255 (b+tap)/255]);
set(handles.t2_5,'backgroundcolor',[(r+tap)/255 g/255 (b+2*tap)/255]);
set(handles.t3_1,'backgroundcolor',[r/255 g/255 (b-2*tap)/255]);
set(handles.t3_2,'backgroundcolor',[r/255 g/255 (b-tap)/255]);
set(handles.t3_3,'backgroundcolor',[r/255 g/255 b/255]);
set(handles.t3_4,'backgroundcolor',[r/255 g/255 (b+tap)/255]);
set(handles.t3_5,'backgroundcolor',[r/255 g/255 (b+2*tap)/255]);
set(handles.t4_1,'backgroundcolor',[(r-tap)/255 g/255 (b-2*tap)/255]);
set(handles.t4_2,'backgroundcolor',[(r-tap)/255 g/255 (b-tap)/255]);
set(handles.t4_3,'backgroundcolor',[(r-tap)/255 g/255 b/255]);
set(handles.t4_4,'backgroundcolor',[(r-tap)/255 g/255 (b+tap)/255]);
set(handles.t4_5,'backgroundcolor',[(r-tap)/255 g/255 (b+2*tap)/255]);
set(handles.t5_1,'backgroundcolor',[(r-2*tap)/255 g/255 (b-2*tap)/255]);
set(handles.t5_2,'backgroundcolor',[(r-2*tap)/255 g/255 (b-tap)/255]);
set(handles.t5_3,'backgroundcolor',[(r-2*tap)/255 g/255 b/255]);
set(handles.t5_4,'backgroundcolor',[(r-2*tap)/255 g/255 (b+tap)/255]);
set(handles.t5_5,'backgroundcolor',[(r-2*tap)/255 g/255 (b+2*tap)/255]);
    case 3
set(handles.t1_1,'backgroundcolor',[(r-2*tap)/255 (g+2*tap)/255 b/255]);
set(handles.t1_2,'backgroundcolor',[(r-tap)/255 (g+2*tap)/255 b/255]);
set(handles.t1_3,'backgroundcolor',[r/255 (g+2*tap)/255 b/255]);
set(handles.t1_4,'backgroundcolor',[(r+tap)/255 (g+2*tap)/255 b/255]);
set(handles.t1_5,'backgroundcolor',[(r+2*tap)/255 (g+2*tap)/255 b/255]);
set(handles.t2_1,'backgroundcolor',[(r-2*tap)/255 (g+tap)/255 b/255]);
set(handles.t2_2,'backgroundcolor',[(r-tap)/255 (g+tap)/255 b/255]);
set(handles.t2_3,'backgroundcolor',[r/255 (g+tap)/255 b/255]);
set(handles.t2_4,'backgroundcolor',[(r+tap)/255 (g+tap)/255 b/255]);
set(handles.t2_5,'backgroundcolor',[(r+2*tap)/255 (g+tap)/255 b/255]);
set(handles.t3_1,'backgroundcolor',[(r-2*tap)/255 g/255 b/255]);
set(handles.t3_2,'backgroundcolor',[(r-tap)/255 g/255 b/255]);
set(handles.t3_3,'backgroundcolor',[r/255 g/255 b/255]);
set(handles.t3_4,'backgroundcolor',[(r+tap)/255 g/255 b/255]);
set(handles.t3_5,'backgroundcolor',[(r+2*tap)/255 g/255 b/255]);
set(handles.t4_1,'backgroundcolor',[(r-2*tap)/255 (g-tap)/255 b/255]);
set(handles.t4_2,'backgroundcolor',[(r-tap)/255 (g-tap)/255 b/255]);
set(handles.t4_3,'backgroundcolor',[r/255 (g-tap)/255 b/255]);
set(handles.t4_4,'backgroundcolor',[(r+tap)/255 (g-tap)/255 b/255]);
set(handles.t4_5,'backgroundcolor',[(r+2*tap)/255 (g-tap)/255 b/255]);
set(handles.t5_1,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
set(handles.t5_2,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
set(handles.t5_3,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
set(handles.t5_4,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
set(handles.t5_5,'backgroundcolor',[r/255 (g-2*tap)/255 b/255]);
end

另外,步距的计算:

space=handles.spacecode;
switch space
    case 1
N = [g b];
    case 2
N = [r b];
    case 3
N = [r g];
end     
mmax=max(N);
mmin=min(N);
mmax=255-mmax;
M=[mmax mmin];
tap=floor(min(M)/2);
set(handles.trap,'string',num2str(tap));
handles.tap=tap;
guidata(hObject,handles);
if tap~=0
set(handles.slider,'value',tap);
set(handles.slider,'max',tap);
set(handles.slider,'sliderstep',[1/tap 1/tap]);
else
set(handles.slider,'value',tap);
set(handles.slider,'max',0.1);
set(handles.slider,'sliderstep',[1 1]);
end

在之前的调色板上,显示出当前步距的各个颜色所在区域,用plot画线画点就够了:

注意L的判断语句,大于50线是黑色,小于50线是白色,以保证可以看清。

 

axes(handles.axes2);
space=handles.spacecode;
switch space
    case 1
        x=b+1;
        y=256-g;
    case 2
        x=b+1;
        y=256-r;
    case 3
        x=r+1;
        y=256-g;
end
sl=get(handles.lab_l,'string');
l=str2num(sl);
if l<=50
        plot(x,y,'Marker','o','Color','w','MarkerSize',5);
        plot(x,y,'Marker','s','Color','w','MarkerSize',333/127*tap*2+0.01);
        plot(x,y,'Marker','s','Color','w','MarkerSize',333/127*tap+0.01);
        hold on;
        else
        plot(x,y,'Marker','o','Color','k','MarkerSize',5);
        plot(x,y,'Marker','s','Color','k','MarkerSize',333/127*tap*2+0.01);
         plot(x,y,'Marker','s','Color','k','MarkerSize',333/127*tap+0.01);
        hold on;
end

三,色库

色库功能:

覆盖到均匀调色板上。

使用txt文档保存每一个颜色的rgb值。

和主界面的色板相关功能配合。

生成方面:

global colorlist_r
global colorlist_g
global colorlist_b
set(handles.seban,'visible','on');
[colorlist_r,colorlist_g,colorlist_b]=textread('.\colorlist.txt','%n %n %n');
set(handles.cl1,'backgroundcolor',[colorlist_r(1)/255 colorlist_g(1)/255 colorlist_b(1)/255]);
set(handles.cl2,'backgroundcolor',[colorlist_r(2)/255 colorlist_g(2)/255 colorlist_b(2)/255]);
set(handles.cl3,'backgroundcolor',[colorlist_r(3)/255 colorlist_g(3)/255 colorlist_b(3)/255]);
set(handles.cl4,'backgroundcolor',[colorlist_r(4)/255 colorlist_g(4)/255 colorlist_b(4)/255]);
set(handles.cl5,'backgroundcolor',[colorlist_r(5)/255 colorlist_g(5)/255 colorlist_b(5)/255]);
set(handles.cl6,'backgroundcolor',[colorlist_r(6)/255 colorlist_g(6)/255 colorlist_b(6)/255]);
set(handles.cl7,'backgroundcolor',[colorlist_r(7)/255 colorlist_g(7)/255 colorlist_b(7)/255]);
set(handles.cl8,'backgroundcolor',[colorlist_r(8)/255 colorlist_g(8)/255 colorlist_b(8)/255]);
set(handles.cl9,'backgroundcolor',[colorlist_r(9)/255 colorlist_g(9)/255 colorlist_b(9)/255]);
set(handles.cl10,'backgroundcolor',[colorlist_r(10)/255 colorlist_g(10)/255 colorlist_b(10)/255]);
set(handles.cl11,'backgroundcolor',[colorlist_r(11)/255 colorlist_g(11)/255 colorlist_b(11)/255]);
set(handles.cl12,'backgroundcolor',[colorlist_r(12)/255 colorlist_g(12)/255 colorlist_b(12)/255]);
set(handles.cl13,'backgroundcolor',[colorlist_r(13)/255 colorlist_g(13)/255 colorlist_b(13)/255]);
set(handles.cl14,'backgroundcolor',[colorlist_r(14)/255 colorlist_g(14)/255 colorlist_b(14)/255]);
set(handles.cl15,'backgroundcolor',[colorlist_r(15)/255 colorlist_g(15)/255 colorlist_b(15)/255]);
set(handles.cl16,'backgroundcolor',[colorlist_r(16)/255 colorlist_g(16)/255 colorlist_b(16)/255]);
set(handles.cl17,'backgroundcolor',[colorlist_r(17)/255 colorlist_g(17)/255 colorlist_b(17)/255]);
set(handles.cl18,'backgroundcolor',[colorlist_r(18)/255 colorlist_g(18)/255 colorlist_b(18)/255]);
set(handles.cl19,'backgroundcolor',[colorlist_r(19)/255 colorlist_g(19)/255 colorlist_b(19)/255]);
set(handles.cl20,'backgroundcolor',[colorlist_r(20)/255 colorlist_g(20)/255 colorlist_b(20)/255]);
set(handles.cl21,'backgroundcolor',[colorlist_r(21)/255 colorlist_g(21)/255 colorlist_b(21)/255]);
set(handles.cl22,'backgroundcolor',[colorlist_r(22)/255 colorlist_g(22)/255 colorlist_b(22)/255]);
set(handles.cl23,'backgroundcolor',[colorlist_r(23)/255 colorlist_g(23)/255 colorlist_b(23)/255]);
set(handles.cl24,'backgroundcolor',[colorlist_r(24)/255 colorlist_g(24)/255 colorlist_b(24)/255]);
set(handles.cl25,'backgroundcolor',[colorlist_r(25)/255 colorlist_g(25)/255 colorlist_b(25)/255]);
set(handles.cl26,'backgroundcolor',[colorlist_r(26)/255 colorlist_g(26)/255 colorlist_b(26)/255]);
set(handles.cl27,'backgroundcolor',[colorlist_r(27)/255 colorlist_g(27)/255 colorlist_b(27)/255]);
set(handles.cl28,'backgroundcolor',[colorlist_r(28)/255 colorlist_g(28)/255 colorlist_b(28)/255]);
set(handles.cl29,'backgroundcolor',[colorlist_r(29)/255 colorlist_g(29)/255 colorlist_b(29)/255]);
set(handles.cl30,'backgroundcolor',[colorlist_r(30)/255 colorlist_g(30)/255 colorlist_b(30)/255]);
set(handles.cl31,'backgroundcolor',[colorlist_r(31)/255 colorlist_g(31)/255 colorlist_b(31)/255]);
set(handles.cl32,'backgroundcolor',[colorlist_r(32)/255 colorlist_g(32)/255 colorlist_b(32)/255]);
set(handles.cl33,'backgroundcolor',[colorlist_r(33)/255 colorlist_g(33)/255 colorlist_b(33)/255]);
set(handles.cl34,'backgroundcolor',[colorlist_r(34)/255 colorlist_g(34)/255 colorlist_b(34)/255]);
set(handles.cl35,'backgroundcolor',[colorlist_r(35)/255 colorlist_g(35)/255 colorlist_b(35)/255]);
set(handles.cl36,'backgroundcolor',[colorlist_r(36)/255 colorlist_g(36)/255 colorlist_b(36)/255]);
set(handles.cl37,'backgroundcolor',[colorlist_r(37)/255 colorlist_g(37)/255 colorlist_b(37)/255]);
set(handles.cl38,'backgroundcolor',[colorlist_r(38)/255 colorlist_g(38)/255 colorlist_b(38)/255]);
set(handles.cl39,'backgroundcolor',[colorlist_r(39)/255 colorlist_g(39)/255 colorlist_b(39)/255]);
set(handles.cl40,'backgroundcolor',[colorlist_r(40)/255 colorlist_g(40)/255 colorlist_b(40)/255]);
set(handles.cl41,'backgroundcolor',[colorlist_r(41)/255 colorlist_g(41)/255 colorlist_b(41)/255]);
set(handles.cl42,'backgroundcolor',[colorlist_r(42)/255 colorlist_g(42)/255 colorlist_b(42)/255]);
axes(handles.axes7);
x = [0 1 1 0];
y = [0 0 1 1];
patch(x,y,[colorlist_r(1)/255 colorlist_g(1)/255 colorlist_b(1)/255])
hold on;
set(handles.list_r,'string',colorlist_r(1));
set(handles.list_g,'string',colorlist_g(1));
set(handles.list_b,'string',colorlist_b(1));

添加新的颜色功能:

global colorlist_r
global colorlist_g
global colorlist_b
set(handles.seban,'visible','on');
[colorlist_r,colorlist_g,colorlist_b]=textread('.\colorlist.txt','%n %n %n');
for i=42:-1:2
    colorlist_r(i)=colorlist_r(i-1);
    colorlist_g(i)=colorlist_g(i-1);
    colorlist_b(i)=colorlist_b(i-1);
end  
sr=get(handles.rgb_r,'string');
sg=get(handles.rgb_g,'string');
sb=get(handles.rgb_b,'string');
colorlist_r(1)=str2num(sr);
colorlist_g(1)=str2num(sg);
colorlist_b(1)=str2num(sb);
fileID =fopen('colorlist.txt','w');
for i=1:1:42
fprintf(fileID,'%d %d %d\n',colorlist_r(i),colorlist_g(i),colorlist_b(i));

四,屏幕拾色器

屏幕拾色器:

覆盖前:

覆盖后:

 完全照搬大佬@slandarer的用法,因为是在gui里面,所以把绘制axes又改成了变化这个botton的backgroundcolor,真的万能啊(乐)。包括axes用法什么的基础知识也从这位大佬那里学到了很多。感谢感谢!

所以就不展示了,各位可以移步去大佬那里学习。

五,杂项

杂项:

点击确认,将当前色序复制到剪切板上:

colorvalue=get(handles.colorvalue,'string');deploytool
clipboard('copy', colorvalue);
%%更新剪切板

在调色板拾取颜色功能,同时保证值的准确,限制在0-255内。

给退出程序做了个确认弹窗:

function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: delete(hObject) closes the figure
button=questdlg('你确定要退出吗?','退出软件','是','否','是'); %内容,标题,选项,默认选项
if strcmp(button,'是')
      delete(hObject);
end

六,总结

总结:

选择一个颜色后,程序需要完成的事情:

1.更新调色板,绘图。

2.更新颜色值。

3.更新最大步距。

4.显示颜色‘当前’或者‘新的’。

5.更新均匀调色板。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值