增加MATLAB屏幕截图功能

时间:2022-06-20
本文章向大家介绍增加MATLAB屏幕截图功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

借助Java或者Python实现截取屏幕指定矩形区域

Java实现

function outputImage=screenCapture(subRegion,outputFile)
robo = java.awt.Robot;
if ~exist('subRegion','var') || isempty(subRegion)
    %获取屏幕尺寸
    t = java.awt.Toolkit.getDefaultToolkit();
    rectangle = java.awt.Rectangle(t.getScreenSize());
else
    x=subRegion(1);
    y=subRegion(2);
    w=subRegion(3);
    h=subRegion(4);
    rectangle = java.awt.Rectangle(x,y,w,h);
end
img = robo.createScreenCapture(rectangle);
%截取矩形局域
if nargout
    %转换为MATLAB矩阵
    h=img.getHeight();
    w=img.getWidth();
    data=img.getData();
    pix=data.getPixels(0,0,w,h,[]);
    tmp=reshape(pix(:),3,w,h);
    outputImage=zeros(h,w,3);
    for ii=1:3
        outputImage(:,:,ii)=squeeze(tmp(ii,:,:))';
    end
end
if exist('outputFile','var')
    %保存文件
    filehandle = java.io.File(outputFile);
    javax.imageio.ImageIO.write(img,'jpg',filehandle);
end
end

Python实现

function outputImage=screenCapture(subRegion,outputFile)
if ~exist('subRegion','var') || isempty(subRegion)
    %获取屏幕尺寸
    subRegion = {0, 0, ...
        py.win32api.GetSystemMetrics(py.win32con.SM_CXSCREEN),...
        py.win32api.GetSystemMetrics(py.win32con.SM_CYSCREEN)};
else
    x=subRegion(1);
    y=subRegion(2);
    w=subRegion(3);
    h=subRegion(4);
    subRegion = {x, y, x+w, y+h};
end
img = py.PIL.ImageGrab.grab().crop(subRegion);
%截取矩形局域
if exist('outputFile','var')
    %保存文件
    img.save(outputFile);
end
if nargout
    %转换为MATLAB矩阵
    data = py.numpy.array(img).reshape(img.height*img.width*3);
    img_arr=cellfun(@uint8,cell(data.data));
    tmp=reshape(img_arr(:),3,w,h);
    outputImage=zeros(h,w,3);
    for ii=1:3
        outputImage(:,:,ii)=squeeze(tmp(ii,:,:))';
    end
    %     outputImage=outputImage/255;
end
end
对
比
Rect=[50,50,50,50];
tic
win.screenCapture(Rect);
toc
时间已过 0.065043 秒。
tic
pywin.screenCapture(Rect);
toc
时间已过 0.080278 秒。

Java实现的版本要快上一些,可能是Python在数值转化的时候耗费了一些时间