MATLAB 制作录屏工具 GUI

  • 主要是因为自己在破解录屏软件的时候弄了好久没安装成功,所以就想着直接用MATLAB写一个小工具来辅助自己,程序不难,主要就是一个使用timer定时获取截图并拼接成gif格式的图片,然后可以指定录屏的大小,这个通过一个调整一个figure的大小来完成,需要了解的知识点就是Java类的使用,稍微查查就明白了。

需要保存三张图片,分别命名为play.jpg,pause.jpg,stop,jpg。
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
效果如下:
在这里插入图片描述


import java.awt.Robot
import java.awt.Rectangle
close all
%% GUI 初始化
homePage = figure('units','pixels','tag','homePage','position',[30 600 150 60],...
    'NumberTitle','off','menubar','none','toolbar','none','resize','off',...
    'DeleteFcn',@delete_timer);
playButton = uicontrol('parent',homePage,'units','pixels','position',...
    [35 0 20 20],'style','pushbutton','callback',@play_pause,'tag','playButton');
stopButton = uicontrol('parent',homePage,'units','pixels','position',...
    [120 0 20 20],'style','pushbutton','callback',@stopfcn,'tag','stopButton');
startText = uicontrol('parent',homePage,'units','pixels','style','text',...
    'position',[0 0 30 15],'string','Start:','fontWeight','bold',...
    'HorizontalAlignment','left');
stopText = uicontrol('parent',homePage,'units','pixels','style','text',...
    'position',[90 0 30 15],'string','Stop:','fontWeight','bold',...
    'HorizontalAlignment','left');
timingText = uicontrol('parent',homePage,'units','pixels','style','text',...
    'position',[0 30 50 15],'string','Timing(s):','fontWeight','bold',...
    'HorizontalAlignment','left');
timing = uicontrol('parent',homePage,'units','pixels','style','text',...
    'position',[80 30 80 15],'string','0.0     ','fontWeight','bold',...
    'HorizontalAlignment','left','tag','timtext');
%% 状态初始化
si = get(0,'ScreenSize');
if si(3) ==1080
    rate =1;
else
    rate = 1.25;
end
playState = 'idle';
play_pic = imread('play.jpg');
stop_pic = imread('stop2.jpg');
pause_pic = imread('pause.jpg');
set(stopButton,'cdata',stop_pic);
set(playButton,'cdata',play_pic);
setappdata(homePage,'play_pic',play_pic);
setappdata(homePage,'pause_pic',pause_pic);
setappdata(homePage,'playState',playState);
setappdata(homePage,'rate',rate);
function play_pause(~,~)
homePage = findobj('tag','homePage');
playState = getappdata(homePage,'playState');
switch playState
    case 'idle'
        capSize = figure('units','pixels','tag','homePage','name','Modify figure size to start',...
            'NumberTitle','off','menubar','none','toolbar','none','tag','capSize');
        ok_button = uicontrol('parent',capSize,'style','pushbutton','string','Start!','position',...
            [0 0 50 50],'callback',@ready);
        
    case 'pause'
        t = timerfind('name','tim');
        start(t);
        setappdata(homePage,'playState','busy');
    case 'busy'
        t = timerfind('name','tim');
        stop(t);
        setappdata(homePage,'playState','pause');
end
end
function stopfcn(~,~)
homePage = findobj('tag','homePage');
playState = getappdata(homePage,'playState');
if ~isequal(playState,'idle')
    t = timerfind();
    stop(t);
    delete(t);
    setappdata(homePage,'playState','idle');
    timtext = findobj('tag','timtext');
    set(timtext,'string','0.0');
    [file path] = uiputfile('*.gif','File Selection','test.gif');
    try
        path = fullfile(path,file);
        movefile('test.gif', file);
        movefile('test.gif', path);
    end
end
end
function ready(~,~)
global robot
global rectangle
homePage = findobj('tag','homePage');
rate = getappdata(homePage,'rate');
robot = java.awt.Robot;
capSize = findobj('tag','capSize');
capSize = get(capSize,'Position')
capSize(4) = capSize(4)+40;
rectangle = java.awt.Rectangle;
rectangle.x = capSize(1)*rate;
rectangle.y = 1080-(capSize(2)+capSize(4))*rate;
rectangle.width = capSize(3)*rate;
rectangle.height = capSize(4)*rate;
close(findobj('tag','capSize'));
t = timer('StartDelay',1,'ExecutionMode','fixedRate','Period',0.2,'TimerFcn',...
    @repfcn,'name','tim','StartFcn',@timerStart,'StopFcn',@timerStop);
start(t);
end
function repfcn(~,~)
global robot
global rate
global rectangle
robot.createScreenCapture(rectangle);
image = robot.createScreenCapture(rectangle);
w = image.getWidth(); %获取图像宽度
h = image.getHeight(); %获取图像高度
raster = image.getData(); %获取图像RGB数据,返回Raster类的对象
I = zeros(w*h*3,1); %创建存储RGB像素信息的double数组
I = raster.getPixels(0,0,w,h,I); %获取图像一维RGB颜色数组
I = uint8(I); %转换成uint8数据类型
I1 = I(1:3:length(I)); %提取R色一维数组
I1 = reshape(I1,w,h); %转换为R色二维数组
I2 = I(2:3:length(I)); %提取G色一维数组
I2 = reshape(I2,w,h); %转换为G色二维数组
I3 = I(3:3:length(I)); %提取B色一维数组
I3 = reshape(I3,w,h); %转换为B色二维数组
I = uint8(zeros(w,h,3)); %创建存储RGB图像信息三维矩阵
I(1:w,1:h,1) = I1; %导入R色数组
I(1:w,1:h,2) = I2; %导入G色数组
I(1:w,1:h,3) = I3; %导入B色数组
I = permute(I,[2 1 3]);
[I,map]=rgb2ind(I,256);
try
   imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.1);  
catch
    imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.1);
end
timtext = findobj('tag','timtext');
ti = get(timtext,'string');
ti = str2double(ti)+0.2;
set(timtext,'string',num2str(ti) );
end
function delete_timer(~,~)
try
    a = timerfind();
    delete(a);
end
end
function timerStart(~,~)
homePage = findobj('tag','homePage');
pause_pic = getappdata(homePage,'pause_pic');
playButton = findobj('tag','playButton');
set(playButton,'cdata',pause_pic);
setappdata(homePage,'playState','busy');
end
function timerStop(~,~)
homePage = findobj('tag','homePage');
play_pic = getappdata(homePage,'play_pic');
playButton = findobj('tag','playButton');
set(playButton,'cdata',play_pic);
setappdata(homePage,'playState','busy');
end
发布了58 篇原创文章 · 获赞 69 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43157190/article/details/104739349