Matlab中getframe函数用法

本文详细介绍MATLAB中的getframe函数,该函数用于捕获坐标区或图窗作为影片帧。文章覆盖了不同语法的使用,包括捕获当前坐标区、指定坐标区、捕获图窗、指定矩形区域等内容,并提供了多个示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

语法

说明

示例

捕获当前坐标区的内容

捕获图窗内容

指定要捕获的矩形区域

计算要包含标题和标签的区域

捕获特定坐标区

记录帧并播放影片


        getframe函数的功能是捕获坐标区或图窗作为影片帧。

语法

F = getframe
F = getframe(ax)
F = getframe(fig)
F = getframe(___,rect)

注意:

        以下是有关 cdata 的大小的一些重要注意事项:

  • 如果查询 getframe 捕获的区域(图窗、坐标区或由 rect 指定的区域)的大小,则以像素为单位的大小可能与 cdata 中的元素数不匹配。这种差异是因为 cdata 中的元素数取决于屏幕分辨率(以及操作系统设置),而 MATLAB® 中的像素数可能不对应于屏幕上的实际像素数。

  • 从 R2015b 开始,如果使用高分辨率系统,则cdata的大小可能大于在以前版本中或在其他系统上的大小。

说明

F= getframe 捕获显示在屏幕上的当前坐标区作为影片帧。F 是一个包含图像数据的结构体。getframe 按照屏幕上显示的大小捕获这些坐标区。它并不捕获坐标区轮廓外部的刻度标签或其他内容。

F= getframe(ax) 捕获 ax 标识的坐标区而非当前坐标区。

F= getframe(fig) 捕获由 fig 标识的图窗。如果您需要捕获图窗窗口的整个内部区域(包括坐标区标题、标签和刻度线),则指定一个图窗。捕获的影片帧不包括图窗菜单和工具栏。

F= getframe(___,rect ) 捕获 rect 定义的矩形内的区域。指定 rect 作为 [left bottom width height] 形式的四元素向量。将此选项用于上一语法中的 ax 或 fig 输入参数。

示例

捕获当前坐标区的内容

        创建一个随机数据图。捕获坐标区并返回图像数据。getframe捕获坐标区的内部区域和坐标区轮廓。它并不捕获延伸到坐标区轮廓之外的内容。

plot(rand(10))
F = getframe;

如图所示:

        F是一个结构体,其中包含的cdata字段中包含捕获的图像数据。使用imshow显示捕获的图像数据。

figure
imshow(F.cdata)

如图所示:

捕获图窗内容

        创建一个曲面图。捕获图窗窗口的内部区域,不包括菜单和工具栏。

surf(peaks)
F = getframe(gcf);

        如图所示:

        F是一个结构体,其中包含的cdata字段中包含捕获的图像数据。使用imshow显示捕获的图像数据。

figure
imshow(F.cdata)

如图所示:

指定要捕获的矩形区域

        捕获坐标区内部区域以及每个方向上 30 像素的边距。需要添加边距捕获帧中才能包括刻度标签。根据刻度标签的大小,可能需要调整边距。创建一个随机数据图。

plot(rand(5))

如图所示:

        将坐标区单位更改为像素并返回当前坐标区位置。位置向量的第三和第四个元素指定坐标区宽度和高度(以像素为单位)。

drawnow
ax = gca;
ax.Units = 'pixels';
pos = ax.Position
pos =

   73.8000   47.2000  434.0000  342.3000

        创建一个四元素向量 rect,以定义涵盖坐标区以及所需边距的矩形区域。rect 的前两个元素相对于坐标区左下角指定矩形左下角。rect 的最后两个元素指定矩形的宽度和高度。将坐标区单位重置为 'normalized' 的默认值。

marg = 30;
rect = [-marg, -marg, pos(3)+2*marg, pos(4)+2*marg];
F = getframe(gca,rect);
ax.Units = 'normalized';

        使用 imshow 显示捕获的图像数据。

figure
imshow(F.cdata)

如图所示:

计算要包含标题和标签的区域

        计算坐标区周围的边距,以使捕获的图像数据包括标题、坐标区标签和刻度标签。创建一个带有标题和 x 轴标签的绘图。

plot(rand(5))
xlabel('x values')
title('Plot of Random Data')

如图所示:

        将坐标区单位更改为像素并存储坐标区的Position 和 TightInset 属性值。TighInset属性是一个 [left bottom right top]形式的四元素向量。这些值是坐标区周围用于刻度值和文本标签的边距。

drawnow
ax = gca;
ax.Units = 'pixels';
pos = ax.Position;
ti = ax.TightInset;

        创建一个四元素向量rect,以定义涵盖坐标区以及自动计算的边距的矩形区域。rect的前两个元素相对于坐标区左下角指定矩形左下角。rect的最后两个元素指定矩形的宽度和高度。

rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
F = getframe(ax,rect);

        使用 imshow 显示捕获的图像数据。

figure
imshow(F.cdata)

如图所示:

捕获特定坐标区

        从 R2019b开始,可以使用tiledlayout和nexttile函数显示分块图。调用tiledlayout函数以创建一个 2×1 分块图布局。调用nexttile函数以创建坐标区对象 ax1 和 ax2。在每个坐标区中绘制一个线条。

tiledlayout(2,1)
ax1 = nexttile;
plot(1:10,'b')
ax2 = nexttile;
plot(1:10,'r')

        ​​​​捕获下坐标区的内容。getframe捕获绘图的内部区域和边框。它并不捕获延伸到绘图轮廓外部的刻度值或标签。

F = getframe(ax2);

        使用 imshow 显示捕获的图像数据。

figure
imshow(F.cdata)

如图所示:

记录帧并播放影片

        通过循环使用getframe记录peaks函数振荡的帧。预分配一个数组以存储影片帧。

Z = peaks;
surf(Z)
axis tight manual
ax = gca;
ax.NextPlot = 'replaceChildren';

loops = 40;
F(loops) = struct('cdata',[],'colormap',[]);
for j = 1:loops
    X = sin(j*pi/10)*Z;
    surf(X,Z)
    drawnow
    F(j) = getframe(gcf);
end

        播放影片两次。

fig = figure;
movie(fig,F,2)

像素

        以像素为单位的距离不依赖 Windows® 和 Macintosh 系统上的系统分辨率:

  • 在 Windows 系统上,一个像素是 1/96 英寸。

  • 在 Macintosh 系统上,一个像素是 1/72 英寸。

        在 Linux® 系统上,一个像素的大小由系统分辨率确定。

提示

  • 为了在使用 getframe 值获得最快的性能,请确保图窗在屏幕上可见。如果图窗不可见,getframe仍可捕获该图窗,但性能可能会减慢。

  • 为了更好地控制图像数据的分辨率,请改用print函数。带有 print 的cdata输出参数返回图像数据。resolution输入参数控制图像的分辨率。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值