2013-06-20 3 views
2

У меня есть загрузка данных в 100 файлах .sdf (с надписью 0000.sdf до 0099.sdf), каждая из которых содержит неподвижное изображение, и я пытаюсь создать .gif из этих изображений.Создание gif из изображений

код я использую для построения фигуры являются (в том же каталоге, что и SDF файлов):

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

Я попытался написать цикл, что бы сюжет фигуру, а затем сохранить его то же самое имя файла, как 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 

EDIT: Я получил следующие ошибки при попытке запустить этот код:

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 и как использовать эти файлы для создания фильма?

+0

Вы пробовали 'saveas'? – macduff

+0

Я сделал, но я получил следующие ошибки: Ошибка при использовании hg.image/get Имя «Единицы» не является доступным свойством для экземпляра класса «image». Ошибка в GetFrame> Local_getRectanglesOfInterest (строка 138) , если ~ strcmpi (получить (H, 'единиц), 'пикселей') ошибок в GetFrame (строка 56) [OffsetRect, absoluteRect, figPos, figOuterPos] =. .. Ошибка в loop_code (строка 4) frm = getframe (fh); – Calculus5000

+1

Это трудно решить, потому что вы не объяснили, что такое изображение .sdf или что делает функция 'GetDataSDF'. Также ваш код не перебирает «a», как вы утверждаете, или сохраняете PNG. Он пытается сохранить JPEG, несмотря на то, что ваш вопрос касается GIF («saveas» не поддерживает GIF, насколько я могу судить). Кажется, нет никаких причин фактически отображать изображения на фигуре, если целью является создание файла. Вы просто хотите прочитать необработанные данные и сохранить их в новом формате изображения. Вы посмотрели на 'imwrite'? Разве это не делает то, что вы хотите? – horchler

ответ

3

Причина ошибки заключается в том, что вы передаете изображения описатель getframe, но эта функция excpects на рисунок ручку. Другая проблема заключается в том, что вы всегда загружаете один и тот же файл и что вы не сохраняете gifs. (Чтобы сохранить цифры как статические изображения, возможно, print - лучший вариант?)

Я попытался изменить свой собственный цикл записи 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 является дескриптором участка осей (не сюжет фигуры!). Это порядка быстрее, чем создавать совершенно новый сюжет в каждой итерации цикла. недостаток что масштабирование (здесь, цветовое масштабирование) будет одинаковым для каждого сюжета. Но в каждом случае, над которым я работал до сих пор, это было фактически desirab ле.

+0

''% 02d' внутри 'num2str (a, '% 02d')' означает: взять число a, превратить его в строку и использовать формат: целое число со знаком (% d), два символа в ширину (2) , и pad с ведущими нулями, если строка слишком короткая (0). Вы можете взглянуть на http://www.mathworks.de/de/help/matlab/ref/num2str.html для полного объяснения того, как работает «formatSpec»! –

+0

Извините за задержку, но у меня, похоже, другая проблема. Как только код закончил, я открыл созданный gif, и в файле не было анимации. У меня была последовательность из 100 изображений (по порядку), как и Powerpoint. Однако, если бы я прокрутил изображения, он переместился бы от картинки к картинке, как и следовало бы. Как объединить все эти снимки в этом файле gif в одном анимированном изображении? Благодаря! Обязательно согласится с этим ответом после работы gif. – Calculus5000

+0

Какую программу вы использовали для открытия GIF? В некоторых моделях графических изображений есть опция, где они будут отображать отдельные изображения, а не анимацию. Браузеры обычно оживляют GIF автоматически. Вы пробовали браузер? –