Как извлечь первый кадр GIF и сохранить его как PNG с помощью GraphicsMagick на NodeJS?

Вот шаги, в которых я хочу это сделать:

  1. Пользователь дает серверу ссылку на анимированный gif
  2. Сервер использует «запрос (url)» для получения файла.
  3. Сервер генерирует миниатюру первого кадра gif.
  4. Сервер загружает миниатюру в Amazon S3.

Проблема существует на шаге 3. Я не могу найти способ извлечь первый кадр GIF. Я бы предпочел использовать GraphicsMagick, но если вы знаете другой способ, который работает, я был бы очень признателен!

Используется NodeJS.


person aleclarson    schedule 19.06.2013    source источник
comment
Для Node.js есть пакет GraphicsMagick: aheckmann.github.io/gm.   -  person GJK    schedule 19.06.2013
comment
@GJK Да, это то, что я использую. К сожалению, когда я пытаюсь добавить [0] в конец URL-адреса, он не захватывает первый кадр. Вместо этого просто сохраняется GIF в дрянном качестве.   -  person aleclarson    schedule 20.06.2013
comment
какую команду graphicsmagick вам нужно использовать и какую команду gm генерирует для вас?   -  person Jonathan Ong    schedule 20.06.2013


Ответы (2)


Я не знаю, почему этого нет в документации, но кто-то другой ответил здесь на stackoverflow.

Таким образом, вы можете использовать это либо со строкой пути к файлу, либо с потоком/буфером, например:

Для файла:

gm('/path/to/animated.gif')
.selectFrame(0)
.write('/path/to/firstframe.png', function(err){
    if (err) print('  :(  ');
})

Для потока/буфера:

gm(streamOrBuffer)
.selectFrame(0)
.write('/path/to/firstframe.png', function(err){
    if (err) print('  :(  ');
})

В документации говорится, что вам нужно изменить строку пути на что-то вроде '/path/to/animated.gif[0]', чтобы быть более конкретным с фреймом, который вы хотите выбрать, но я протестировал этот код без указания фрейма, и он работал нормально (используя [email protected] и ImageMagick 6.7.7-10 2014-03-06). Кроме того, то, что было в документации (без использования selectFrame), не работало. Это закончилось сбоем и созданием нескольких png-кадров всего gif в процессе.

Почему они до сих пор не задокументировали selectFrame, мне непонятно. Как они указали в процитированной ссылке, существует открытая проблема, задающаяся именно этим вопросом.

person Lucio Mollinedo    schedule 11.03.2016

Поскольку я не мог заставить его работать на стороне сервера, я просто нарисовал .gif в элемент <canvas>, чтобы «имитировать» извлечение первого кадра .gif. Это дало мне приостановленную гифку, к которой я стремился.

person aleclarson    schedule 25.02.2014