2

我正在尝试从补丁中渲染视频。视频为 25fps,我的代码在将每个补丁写入图像之前将其渲染到屏幕上。我在补丁中尝试了“可见”、“关闭”选项,但这只会导致我的电影出现空白帧。我可以使用 patch 函数来写入文件,但不渲染到屏幕上吗?

for k = 1:length(obj.shape)
    fig = patch('Vertices', obj.shape(k).vertices',...
    'Faces', obj.shape(k).faces', 'FaceColor', [0.8 0.5 0.2],...
    'LineStyle', 'none', 'FaceLighting', 'phong', 'Visible', 'on');
    light('Position', [1 0 0], 'Style', 'infinite');
    View(180, 90);
    f = getframe(gcf);
    close(gcf);
    imwrite(f.cdata, [directory '/frame_' int2str(k) '.jpg'], 'jpg');
end
4

2 回答 2

2

问题是getframe() 将图形设置为可见(您可以通过键入“ edit getframe ”,第 100-125 行看到)。尽管我完全理解您的需求,但我不确定是否有任何直接的方法可以满足您的要求。

于 2012-02-07T15:31:12.187 回答
1

getframe不使用隐形的原因是它捕获了实际的屏幕内容。如果您愿意使用,您可以实现您想要的print

figure
set(gcf, 'Visible', 'off')
for ...
    < draw your animation frame >
    print('-r300', '-djpeg', '[directory '/frame_' int2str(k) '.jpg'])
end

缺点是您保存的图像看起来与屏幕上的不太一样,因为它是由 Matlab 的打印机制生成的。您可以通过指定分辨率、在“页面”上设置图形位置和大小等来调整其外观。

顺便说一句,为每一帧制作一个新图形可能不是一个好主意,只需重复使用一个并覆盖其内容即可。此外,对于视频、动画 gif 等的后处理,最好使用像 PNG 这样的无损文件格式。

于 2014-08-18T11:39:45.850 回答