突然发现cla函数也可以应用到app designer控件上,因而对部分内容做出更改,将绘制隐藏像素刷新的方式改为用cla

hold(acAxes,'off');
image(acAxes,[-1,0],[-1,0],ones(1,1,3),'visible','off');
hold(acAxes,'on');delete(findobj('tag','ax'));

cla(acAxes)
cla(ax)

0效果


1字符图片生成

如果我们单纯的用text绘制图形,就无法做到效果中符号和符号边缘两个颜色,也无法做到更大程度的变形,因此我们需要将字符转换为矩阵形式。
想要实现也非常简单,我们只需要创建一个不可视的fig,在其上绘制字符,保存fig为png格式图片,再通过imread读取图片,就能获得字符矩阵:
第一次运行程序因为要生成字符图片因而会比较慢,再次运行就可以读取之前已经生成过的图片啦:

% 字符图片矩阵构造 ========================================================
% 以下为字符图片创建过程
% 原理为构造隐藏的figure和axes
% 在其上用text绘制字符并保存figure为图片
% 导入图片
if ~exist('Materials','dir')mkdir('Materials');
end
fig=figure('units','pixels',...'position',[20 80 200 200],...'Numbertitle','off',...'Color',[1 1 1],...'resize','off',...'visible','off',...'menubar','none');
ax=axes('Units','pixels',...'parent',fig,...  'Color',[1 1 1],...'Position',[0 0 200 200],...'XLim',[0 200],...'YLim',[0 200],...'XColor',[1 1 1],...'YColor',[1 1 1]);
strPic{length(strElement)}=[];
for i=1:length(strElement)% 若是不存在该字符图片则生成,否则直接导入if ~exist(['.\Materials\',strElement(i),'.png'],'file')delete(findobj('tag','textStr'));text(ax,100,100,strElement(i),'HorizontalAlignment',...'center','FontSize',140,'tag','textStr','FontWeigh','bold')saveas(fig,['.\Materials\',strElement(i),'.png']);     % 保存图片endtempPic=imread(['.\Materials\',strElement(i),'.png']);     % 读取图片strPic{i}=imresize(tempPic,[150,150]);             % 重新调整图片大小
end

2刷新按钮生成

大家可以看到这个按钮的样式与大部分按钮不同:


实际上这是一个HTML控件,输入html文件的位置就可以形成类似嵌入页面的效果:

acHTML=uihtml(acFigure);
acHTML.HTMLSource='.\Materials\textbtn.html';
acHTML.DataChangedFcn=@refresh;
acHTML.Position=[300 50 88 26];

如代码所示,我们导入的是Materials文件夹内的textbtn.html文件
textbtn.html长这样:

<!DOCTYPE html>
<html><head><meta charset=UTF-8><script type="text/javascript">function setup(htmlComponent) {           document.getElementById("btnonclink").addEventListener("click", function(event) {htmlComponent.Data="test";});}</script></head><body><a href="" id="btnonclink">看不清?</a></body>
</html>

当然为了防止大家不会创建,我在m文件中写了一段能够自动创建html文件的代码,原理就是将字符串信息写入txt,再将txt文件后缀改为html:

% .html文件自动生成及引入 - - - - - - - - - - - - - - - - - - - - - - - - -
htmlContent={'<!DOCTYPE html><html><head><meta charset=UTF-8>';
'<script type="text/javascript">';
'function setup(htmlComponent){';
'document.getElementById("btnonclink").addEventListener("click",function(event){';
'htmlComponent.Data="test";});}</script></head>';
'<body><a href="" id="btnonclink">看不清?</a></body></html>'};
if ~exist('.\Materials\textbtn.html','file')fid=fopen('.\Materials\textbtn.txt','w');for i=1:length(htmlContent)fprintf(fid,'%s\r\n',htmlContent{i}); endfclose(fid);copyfile('.\Materials\textbtn.txt','.\Materials\textbtn.html');delete('.\Materials\textbtn.txt')
end

3图片处理

3.1图像任意方向拉伸

这部分原理就是将图像旋转一定角度后,在竖直方向进行拉伸后再旋转回去:

3.2字符边缘

这部分原理将字符均值滤波后,把不完全是黑色的部分设置为灰色,后期再设置为其他颜色:

3.3图像处理部分代码

randColor=@()randi([0,200],[1,3]);   % 生成随机颜色的匿名函数% 从图像集合中提取图像
tPic=strPic{randiNums(ii)};
tPic=tPic(:,:,1);% 将图像旋转-拉伸-旋转
randiTheta1=randi([0,90]);
randiTheta2=randi([-30,30]);
randiLenth=randi([0,70]);
tPic=imrotate(255-tPic,randiTheta1,'bilinear','crop');
tPic=imresize(tPic,[150+randiLenth,150]);
tPic=imrotate(tPic,-randiTheta1+randiTheta2,'bilinear','crop');% 将图像边缘进行模糊,并将模糊的部分数值设置为150
tPic=255-imfilter(tPic,I_5);
tPic(tPic~=0&tPic~=255)=150;% 为符号和符号边缘赋予不同颜色
tempColor1=randColor();tempColor2=randColor();
tempPicR=tPic;tempPicG=tPic;tempPicB=tPic;
tempPicR(tPic==150)=tempColor1(1);tempPicR(tPic==0)=tempColor2(1);
tempPicG(tPic==150)=tempColor1(2);tempPicG(tPic==0)=tempColor2(2);
tempPicB(tPic==150)=tempColor1(3);tempPicB(tPic==0)=tempColor2(3);tempPic_3=uint8(zeros([size(tPic),3]));
tempPic_3(:,:,1)=tempPicR;
tempPic_3(:,:,2)=tempPicG;
tempPic_3(:,:,3)=tempPicB;

4线条和散点生成

散点就是生成一堆随机位置点和一些随机颜色后用scatter函数绘制,线条是生成散点后使用’spline’插值方法插值成线后再绘制:

randColor=@()randi([0,200],[1,3]);           % 生成随机颜色的匿名函数
randColor_n=@(n)randi([0,200],[n,3])./255;   % 生成n个随机颜色的匿名函数
randPoint_n=@(n)[randi([5,195],[n,1]),randi([5,65],[n,1])];% 生成n个随机点的匿名函数% 绘制散点
pPonintsNum=randi([6,10]);
pPoints=randPoint_n(pPonintsNum);
pPointsColor=randColor_n(pPonintsNum);
scatter(acAxes,pPoints(:,1),pPoints(:,2),6,'filled',...'CData',pPointsColor,'AlphaData',0.6)% 绘制线
lPonintsNum=randi([5,7]);
lPoints=randPoint_n(lPonintsNum);
lPointsColor=[randColor()./255,0.6];
x_lPoints=interp1(1:lPonintsNum,lPoints(:,1),1:0.01:lPonintsNum,'spline');
y_lPoints=interp1(1:lPonintsNum,lPoints(:,2),1:0.01:lPonintsNum,'spline');
plot(acAxes,x_lPoints,y_lPoints,'Color',lPointsColor,'LineWidth',1.5)

5关于图像存储

由于目前版本uifigure还不支持存储为图像,因此我们绘制图像是在figure和uifigure分别绘制一遍,其中figure依旧是不可见状态,主要用于将图片验证码保存为png格式,可以在完整代码中看出这一点。

同时,本程序的设置为,每次刷新图形验证码,都会刷新当前文件夹下authCode.png为最新的验证码,如需要保存请及时将其改名或复制另存:

6关于验证码对比

首先就是需要提取框内验证码:

codeInPut=acEditField.Value;

因为我们的验证码字符都是大写的,将输入的文本用upper函数变为大写:

codeInPut=upper(codeInPut);

同时我们因为0和O长的太像,所以不对其进行区分,直接将输入的验证码中的0改为O:

codeInPut(codeInPut=='0')='O';

之后就能够用strcmp函数将当前验证码和输入的验证码进行对比:

if strcmp(codeInPut,authCode)msgbox('验证码正确')
elsemsgbox('验证码错误')
end

7完整代码

function authCode
strElement=char([49:57,65:90]);              % 1-9,A-Z的字符
randColor=@()randi([0,200],[1,3]);           % 生成随机颜色的匿名函数
randColor_n=@(n)randi([0,200],[n,3])./255;   % 生成n个随机颜色的匿名函数
randPoint_n=@(n)[randi([5,195],[n,1]),randi([5,65],[n,1])];% 生成n个随机点的匿名函数
global authCode;                             % 全局变量:验证码% 字符图片矩阵构造 ========================================================
% 以下为字符图片创建过程
% 原理为构造隐藏的figure和axes
% 在其上用text绘制字符并保存figure为图片
% 导入图片
if ~exist('Materials','dir')mkdir('Materials');
end
fig=figure('units','pixels',...'position',[20 80 200 200],...'Numbertitle','off',...'Color',[1 1 1],...'resize','off',...'visible','off',...'menubar','none');
ax=axes('Units','pixels',...'parent',fig,...  'Color',[1 1 1],...'Position',[0 0 200 200],...'XLim',[0 200],...'YLim',[0 200],...'XColor',[1 1 1],...'YColor',[1 1 1]);
strPic{length(strElement)}=[];
for i=1:length(strElement)% 若是不存在该字符图片则生成,否则直接导入if ~exist(['.\Materials\',strElement(i),'.png'],'file')delete(findobj('tag','textStr'));text(ax,100,100,strElement(i),'HorizontalAlignment',...'center','FontSize',140,'tag','textStr','FontWeigh','bold')saveas(fig,['.\Materials\',strElement(i),'.png']);     % 保存图片endtempPic=imread(['.\Materials\',strElement(i),'.png']);     % 读取图片strPic{i}=imresize(tempPic,[150,150]);             % 重新调整图片大小
end% 更改fig ax样式,为方便后期验证码存储
fig.Position=[100 100 200 70];
ax.Position=[1 1 199.5 70];
ax.XTick=[];
ax.YTick=[];
ax.XLim=[0,200];
ax.YLim=[0,70];
ax.XColor=[0.7 0.7 0.7];
ax.YColor=[0.7 0.7 0.7];
ax.Box='on';
ax.YDir='reverse';
hold(ax,'on');% APP designer窗口构建 ====================================================
acFigure=uifigure();
acFigure.Position=[100 100 370 90];
acFigure.Name='authCode';
acFigure.Resize='off';acAxes=uiaxes(acFigure);
acAxes.Position=[10 10 200 70];
acAxes.XTick=[];
acAxes.YTick=[];
acAxes.XLim=[0,200];
acAxes.YLim=[0,70];
acAxes.XColor=[0.7 0.7 0.7];
acAxes.YColor=[0.7 0.7 0.7];
acAxes.Box='on';
acAxes.YDir='reverse';
hold(acAxes,'on');acEditField=uieditfield(acFigure,'text');
acEditField.Position=[220 52 70 23];
acEditField.FontSize=16;
acEditField.FontWeight='bold';
acEditField.FontColor=[0.3,0.3,0.3];% .html文件自动生成及引入 - - - - - - - - - - - - - - - - - - - - - - - - -
htmlContent={'<!DOCTYPE html><html><head><meta charset=UTF-8>';
'<script type="text/javascript">';
'function setup(htmlComponent){';
'document.getElementById("btnonclink").addEventListener("click",function(event){';
'htmlComponent.Data="test";});}</script></head>';
'<body><a href="" id="btnonclink">看不清?</a></body></html>'};
if ~exist('.\Materials\textbtn.html','file')fid=fopen('.\Materials\textbtn.txt','w');for i=1:length(htmlContent)fprintf(fid,'%s\r\n',htmlContent{i}); endfclose(fid);copyfile('.\Materials\textbtn.txt','.\Materials\textbtn.html');delete('.\Materials\textbtn.txt')
end
acHTML=uihtml(acFigure);
acHTML.HTMLSource='.\Materials\textbtn.html';
acHTML.DataChangedFcn=@refresh;
acHTML.Position=[300 50 88 26];
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -acButton=uibutton(acFigure);
acButton.Position=[220 15 140 30];
acButton.Text='确 认 验 证 码';
acButton.BackgroundColor=[0.31 0.58 0.80];
acButton.FontColor=[1 1 1];
acButton.FontWeight='bold';
acButton.FontSize=14;
acButton.ButtonPushedFcn=@verify;% 回调函数 ================================================================function refresh(~,~)cla(acAxes)cla(ax)I_5=fspecial('average',[5,5]);   % 5*5均值滤波模板randiNums=randi([1,length(strElement)],[1,4]);authCode=strElement(randiNums);  % 验证码disp(authCode)for ii=1:4tPic=strPic{randiNums(ii)};tPic=tPic(:,:,1);%tempPic(tempPic<250)=150;% 将图像旋转-拉伸-旋转randiTheta1=randi([0,90]);randiTheta2=randi([-30,30]);randiLenth=randi([0,70]);    tPic=imrotate(255-tPic,randiTheta1,'bilinear','crop');tPic=imresize(tPic,[150+randiLenth,150]);tPic=imrotate(tPic,-randiTheta1+randiTheta2,'bilinear','crop'); % 将图像边缘进行模糊,并将模糊的部分数值设置为150tPic=255-imfilter(tPic,I_5);tPic(tPic~=0&tPic~=255)=150;% 为符号和符号边缘赋予不同颜色tempColor1=randColor();tempColor2=randColor();tempPicR=tPic;tempPicG=tPic;tempPicB=tPic;tempPicR(tPic==150)=tempColor1(1);tempPicR(tPic==0)=tempColor2(1);tempPicG(tPic==150)=tempColor1(2);tempPicG(tPic==0)=tempColor2(2);tempPicB(tPic==150)=tempColor1(3);tempPicB(tPic==0)=tempColor2(3);tempPic_3=uint8(zeros([size(tPic),3]));tempPic_3(:,:,1)=tempPicR;tempPic_3(:,:,2)=tempPicG;tempPic_3(:,:,3)=tempPicB;% 显示图片image(acAxes,[-size(tempPic_3,2)/2,size(tempPic_3,2)/2]./3.5+40*ii+randi([-5,5]),...[-size(tempPic_3,1)/2,size(tempPic_3,1)/2]./3.5+35+randi([-5,5]),...tempPic_3,'AlphaData',tempPic_3(:,:,1)~=255,'Interpolation','bilinear')image(ax,[-size(tempPic_3,2)/2,size(tempPic_3,2)/2]./3.5+40*ii+randi([-5,5]),...[-size(tempPic_3,1)/2,size(tempPic_3,1)/2]./3.5+35+randi([-5,5]),...tempPic_3,'AlphaData',tempPic_3(:,:,1)~=255,'Interpolation','bilinear')         end% 绘制散点pPonintsNum=randi([6,10]);pPoints=randPoint_n(pPonintsNum);pPointsColor=randColor_n(pPonintsNum);scatter(acAxes,pPoints(:,1),pPoints(:,2),6,'filled',...'CData',pPointsColor,'AlphaData',0.6)scatter(ax,pPoints(:,1),pPoints(:,2),6,'filled',...'CData',pPointsColor,'AlphaData',0.6)% 绘制线lPonintsNum=randi([5,7]);lPoints=randPoint_n(lPonintsNum);lPointsColor=[randColor()./255,0.6];x_lPoints=interp1(1:lPonintsNum,lPoints(:,1),1:0.01:lPonintsNum,'spline');y_lPoints=interp1(1:lPonintsNum,lPoints(:,2),1:0.01:lPonintsNum,'spline');plot(acAxes,x_lPoints,y_lPoints,'Color',lPointsColor,'LineWidth',1.5)plot(ax,x_lPoints,y_lPoints,'Color',lPointsColor,'LineWidth',1.5)saveas(fig,'.\authCode.png');end
refresh()function verify(~,~)codeInPut=acEditField.Value;codeInPut=upper(codeInPut);codeInPut(codeInPut=='0')='O';if strcmp(codeInPut,authCode)msgbox('验证码正确')elsemsgbox('验证码错误')endendend

:程序第一次运行由于有html文件及png文件需要生成,因而会比较慢,之后的运行速度会快很多。

对于以前版本没有uihtml控件可以先尝试如下代码:

这里用正常按钮替换了uihtml控件

function authCode2
strElement=char([49:57,65:90]);              % 1-9,A-Z的字符
randColor=@()randi([0,200],[1,3]);           % 生成随机颜色的匿名函数
randColor_n=@(n)randi([0,200],[n,3])./255;   % 生成n个随机颜色的匿名函数
randPoint_n=@(n)[randi([5,195],[n,1]),randi([5,65],[n,1])];% 生成n个随机点的匿名函数
global authCode;                             % 全局变量:验证码% 字符图片矩阵构造 ========================================================
% 以下为字符图片创建过程
% 原理为构造隐藏的figure和axes
% 在其上用text绘制字符并保存figure为图片
% 导入图片
if ~exist('Materials','dir')mkdir('Materials');
end
fig=figure('units','pixels',...'position',[20 80 200 200],...'Numbertitle','off',...'Color',[1 1 1],...'resize','off',...'visible','off',...'menubar','none');
ax=axes('Units','pixels',...'parent',fig,...  'Color',[1 1 1],...'Position',[0 0 200 200],...'XLim',[0 200],...'YLim',[0 200],...'XColor',[1 1 1],...'YColor',[1 1 1]);
strPic{length(strElement)}=[];
for i=1:length(strElement)% 若是不存在该字符图片则生成,否则直接导入if ~exist(['.\Materials\',strElement(i),'.png'],'file')delete(findobj('tag','textStr'));text(ax,100,100,strElement(i),'HorizontalAlignment',...'center','FontSize',140,'tag','textStr','FontWeigh','bold')saveas(fig,['.\Materials\',strElement(i),'.png']);     % 保存图片endtempPic=imread(['.\Materials\',strElement(i),'.png']);     % 读取图片strPic{i}=imresize(tempPic,[150,150]);             % 重新调整图片大小
end% 更改fig ax样式,为方便后期验证码存储
fig.Position=[100 100 200 70];
ax.Position=[1 1 199.5 70];
ax.XTick=[];
ax.YTick=[];
ax.XLim=[0,200];
ax.YLim=[0,70];
ax.XColor=[0.7 0.7 0.7];
ax.YColor=[0.7 0.7 0.7];
ax.Box='on';
ax.YDir='reverse';
hold(ax,'on');% APP designer窗口构建 ====================================================
acFigure=uifigure();
acFigure.Position=[100 100 370 90];
acFigure.Name='authCode';
acFigure.Resize='off';acAxes=uiaxes(acFigure);
acAxes.Position=[10 10 200 70];
acAxes.XTick=[];
acAxes.YTick=[];
acAxes.XLim=[0,200];
acAxes.YLim=[0,70];
acAxes.XColor=[0.7 0.7 0.7];
acAxes.YColor=[0.7 0.7 0.7];
acAxes.Box='on';
acAxes.YDir='reverse';
hold(acAxes,'on');acEditField=uieditfield(acFigure,'text');
acEditField.Position=[220 52 70 23];
acEditField.FontSize=16;
acEditField.FontWeight='bold';
acEditField.FontColor=[0.3,0.3,0.3];acfreshBtn=uibutton(acFigure);
acfreshBtn.Text='看不清?';
acfreshBtn.ButtonPushedFcn=@refresh;
acfreshBtn.Position=[300 50 60 27];
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -acButton=uibutton(acFigure);
acButton.Position=[220 15 140 30];
acButton.Text='确 认 验 证 码';
acButton.BackgroundColor=[0.31 0.58 0.80];
acButton.FontColor=[1 1 1];
acButton.FontWeight='bold';
acButton.FontSize=14;
acButton.ButtonPushedFcn=@verify;% 回调函数 ================================================================function refresh(~,~)cla(acAxes)cla(ax)
%         hold(acAxes,'off');
%         image(acAxes,[-1,0],[-1,0],ones(1,1,3),'visible','off');
%         hold(acAxes,'on');
%         delete(findobj('tag','ax'));I_5=fspecial('average',[5,5]);   % 5*5均值滤波模板randiNums=randi([1,length(strElement)],[1,4]);authCode=strElement(randiNums);  % 验证码disp(authCode)for ii=1:4tPic=strPic{randiNums(ii)};tPic=tPic(:,:,1);%tempPic(tempPic<250)=150;% 将图像旋转-拉伸-旋转randiTheta1=randi([0,90]);randiTheta2=randi([-30,30]);randiLenth=randi([0,70]);    tPic=imrotate(255-tPic,randiTheta1,'bilinear','crop');tPic=imresize(tPic,[150+randiLenth,150]);tPic=imrotate(tPic,-randiTheta1+randiTheta2,'bilinear','crop'); % 将图像边缘进行模糊,并将模糊的部分数值设置为150tPic=255-imfilter(tPic,I_5);tPic(tPic~=0&tPic~=255)=150;% 为符号和符号边缘赋予不同颜色tempColor1=randColor();tempColor2=randColor();tempPicR=tPic;tempPicG=tPic;tempPicB=tPic;tempPicR(tPic==150)=tempColor1(1);tempPicR(tPic==0)=tempColor2(1);tempPicG(tPic==150)=tempColor1(2);tempPicG(tPic==0)=tempColor2(2);tempPicB(tPic==150)=tempColor1(3);tempPicB(tPic==0)=tempColor2(3);tempPic_3=uint8(zeros([size(tPic),3]));tempPic_3(:,:,1)=tempPicR;tempPic_3(:,:,2)=tempPicG;tempPic_3(:,:,3)=tempPicB;% 显示图片image(acAxes,[-size(tempPic_3,2)/2,size(tempPic_3,2)/2]./3.5+40*ii+randi([-5,5]),...[-size(tempPic_3,1)/2,size(tempPic_3,1)/2]./3.5+35+randi([-5,5]),...tempPic_3,'AlphaData',tempPic_3(:,:,1)~=255,'Interpolation','bilinear')image(ax,[-size(tempPic_3,2)/2,size(tempPic_3,2)/2]./3.5+40*ii+randi([-5,5]),...[-size(tempPic_3,1)/2,size(tempPic_3,1)/2]./3.5+35+randi([-5,5]),...tempPic_3,'AlphaData',tempPic_3(:,:,1)~=255,'Interpolation','bilinear')         end% 绘制散点pPonintsNum=randi([6,10]);pPoints=randPoint_n(pPonintsNum);pPointsColor=randColor_n(pPonintsNum);scatter(acAxes,pPoints(:,1),pPoints(:,2),6,'filled',...'CData',pPointsColor,'AlphaData',0.6)scatter(ax,pPoints(:,1),pPoints(:,2),6,'filled',...'CData',pPointsColor,'AlphaData',0.6)% 绘制线lPonintsNum=randi([5,7]);lPoints=randPoint_n(lPonintsNum);lPointsColor=[randColor()./255,0.6];x_lPoints=interp1(1:lPonintsNum,lPoints(:,1),1:0.01:lPonintsNum,'spline');y_lPoints=interp1(1:lPonintsNum,lPoints(:,2),1:0.01:lPonintsNum,'spline');plot(acAxes,x_lPoints,y_lPoints,'Color',lPointsColor,'LineWidth',1.5)plot(ax,x_lPoints,y_lPoints,'Color',lPointsColor,'LineWidth',1.5)saveas(fig,'.\authCode.png');end
refresh()function verify(~,~)codeInPut=acEditField.Value;codeInPut=upper(codeInPut);codeInPut(codeInPut=='0')='O';if strcmp(codeInPut,authCode)msgbox('验证码正确')elsemsgbox('验证码错误')endendend

教你使用MATLAB制作一款 图形验证码 生成器(app designer)相关推荐

  1. 手把手教你用MATLAB制作一款 [狗头翻牌子] 小游戏(点灯游戏)

    0 游戏效果 就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利. 1 fig界面和背景板 这一段比较简单,主要是对界面和背景板的属性设置,我们采用编程的 ...

  2. 教你用matlab制作一款黄金矿工小游戏

    效果 步骤 0 图片准备 本文所使用图片在这: 网盘链接:https://pan.baidu.com/s/1CWL1R-rbTMFEy_G_P2JfgQ 提取码:kl17 1 背景构建 functio ...

  3. 教你使用MATLAB制作水波倒影特效

    注: 本文算法参考大佬 grafx 的这篇博客: 图像处理算法之水面倒影特效 由于本文使用MATLAB复现,因此很多语法上会显得比较简洁,同时本博文对原大佬文章部分内容进行了改写,详见本文: 0效果展 ...

  4. 其实你也可以制作一款专属的书架app,信不信看看就知道

    什么"一键书架"? "一键书架"相当于一个迷你图书馆,可以管理9本图书,在线制作,离线阅读. "一键书架"特色 1.它彻底打破了以往的技术门 ...

  5. MATLAB 版几何画板小工具(App designer)

    使用MATLAB App designer制作了一款几何画板小工具,参考了几何画板及oripa等软件: 该程序可以计算得到所有交点位置,并在鼠标移动到交点位置处给予提示,同时属性设置栏可以隐藏(设置按 ...

  6. ai绘画生成器app是什么?安利三款ai绘画生成器app

    你是否曾经因为缺乏艺术细胞而自卑,或者看到别人画风清奇而嫉妒不已?现在,你可以放心大胆地发挥创造力了,因为有了ai绘画生成器,想要成为艺术大师已经不再是梦想!这些app让你在不会画画的情况下也可以轻松 ...

  7. 教你用Python制作一款自己的杀毒程序

    在本文中,我们将介绍恶意软件静态分析的基础知识.静态分析是对程序文件的反汇编代码.图形图像.可打印字符串和其他磁盘资源进行分析,是一种不需要实际运行程序的逆向工程.虽然静态分析技术有欠缺之处,但是它可 ...

  8. 《MATLAB App Designer从入门到实践》随书源代码

    GUIDE已经被MATLAB抛弃了,你还不知道吗?App Designer才是发展的方向 目前市面上MATLAB GUI编程的书籍琳琅满目,但大多数是基于GUIDE开发的,MATLAB从2016年开始 ...

  9. MATLAB 制作抖音同款 立体人物文字海报

    效果如下: 步骤 1.导入图片并制作文字图 原图在这里: 原理就是创建一个隐藏的fig窗口,画完图后存储为图片,再调节至与原本图片相同大小 代码: string='you are very welco ...

最新文章

  1. EOS 消息设计(2)并行处理
  2. iOS之“微信支付”开发流程
  3. (进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02
  4. 谷歌正在移除 Chrome 的“关闭其他选项卡”选项
  5. Docker学习总结(63)——容器并不能解决一切问题
  6. 面向资源的权限体系设计随想
  7. Python——python3的requests模块的导入
  8. 【信息技术】【2014.07】交通监控中的车辆跟踪与速度估计
  9. rtorrent ubuntu端命令行种子下载器
  10. android cts问题分析,一则CTS测试错误分析
  11. 简单使用PHP 的 Silm框架.
  12. IPO图(INPUT PROCESS OUTPUT)
  13. python怎么学比较快,怎样快速学会python
  14. 华农华迪实训训练-获得词频前10的字段数据-requests+Spark RDD
  15. C语言readdir()函数:读取目录函数
  16. 软件测试——功能测试(缺陷)2
  17. Ubuntu上nc的安装与使用
  18. 容器化技术【Kubernetes】
  19. Java实现三位数的水仙花数计算
  20. 解决电商订单与支付大数据量的解决方案

热门文章

  1. PhysX官方手册翻译(二)
  2. 驱动人生被曝利用高危漏洞传播病毒,半天感染数万台电脑
  3. 系统盘重装linux,制作linuxu盘启动盘电脑系统盘重装启动
  4. Linux 命令之 bzip2 -- bz2文件的压缩程序
  5. 阿里云域名申请免费DV SSL认证
  6. 水利防汛抗旱知识普及篇
  7. 彻底清除谷歌浏览器注册表方法(简单有效)
  8. 局域网内抢网速_濮阳联通案例分享:某单位网速慢的处理分享
  9. 谈谈“.花季(滑稽)护航”
  10. 给机器加脑子的“三板斧”