2

我在 100 个 .sdf 文件(标记为 0000.sdf 到 0099.sdf)中有大量数据,每个文件都包含一个静止图像,我正在尝试从这些图像中生成一个 .gif。

我用来绘制图形的代码是(在与 sdf 文件相同的目录中):

q = GetDataSDF('0000.sdf');
imagesc(q.data');

我试图编写一个 for 循环来绘制图形,然后使用与 sdf 文件相同的文件名保存它,但无济于事,使用:

for a = 1:100
    q=GetDataSDF('0000.sdf');
    fh = imagesc(q.dist_fn.x_px.Left.data');
    frm = getframe( fh );
    % save as png image
    saveas(fh, 'current_frame_%02d.jpg');
end

编辑:尝试运行此代码时收到以下错误:

Error using hg.image/get
The name 'Units' is not an accessible property for an instance of class 'image'.

Error in getframe>Local_getRectanglesOfInterest (line 138)
  if ~strcmpi(get(h, 'Units'), 'Pixels')

Error in getframe (line 56)
  [offsetRect, absoluteRect, figPos, figOuterPos] = ...

Error in loop_code (line 4)
    frm = getframe( fh );

如何使用 for 循环保存这些文件,然后如何使用这些文件制作电影?

4

1 回答 1

3

错误的原因是您将图像句柄传递给getframe,但此函数需要图形句柄。另一个问题是您总是加载相同的文件,并且您保存的文件不适用于 gif。(为了将数字保存为静态图像,也许打印是更好的选择?)

我试图修改我自己的 gif 写入循环,以便它与您的数据一起使用。我会尽量在评论中更加明确,因为你似乎开始了。请记住,您始终可以使用help name_of_command来显示简短的 Matlab 帮助。

% Define a variable that holds the frames per second your "movie" should have
gif_fps = 24; 
% Define string variable that holds the filename of your movie
video_filename = 'video.gif';

% Create figure 1, store the handle in a variable, you'll need it later
fh = figure(1);
for a = 0:99
    % Prepare file name so that you loop over the data
    q = GetDataSDF(['00' num2str(a,'%02d') 'sdf']);
    % Plot image
    imagesc(q.dist_fn.x_px.Left.data');
    % Force Matlab to actually do the plot (it sometimes gets lazy in loops)  
    drawnow;
    % Take a "screenshot" of the figure fh
    frame = getframe(fh);
    % Turn screenshot into image
    im = frame2im(frame);
    % Turn image into indexed image (the gif format needs this)
    [imind,cm] = rgb2ind(im,256);
    % If first loop iteration: Create the file, else append to it
    if a == 0;
        imwrite(imind,cm,video_filename,'gif', 'Loopcount',inf);
    else
        imwrite(imind,cm,video_filename,'gif','WriteMode','append','DelayTime',1/gif_fps);
    end
end

plot还有一点需要注意:当每个图的数据大小相同时,只使用一次(或在这种情况下, )命令是有意义的imagesc,并且在以后的循环迭代中将其替换为set(ah,'Ydata',new_y_data)(或在这种情况下set(ah,'CData',q.dist_fn.x_px.Left.data'),其中ah是绘图的句柄(不是绘图!)。这比在每次循环迭代中创建一个全新的绘图要快几个数量级。缺点是缩放(这里是颜色缩放)将是相同的对于每个情节。但到目前为止,在我所做的每一个案例中,这实际上都是可取的。

于 2013-06-20T20:04:49.700 回答