Преобразование PNG в анимированный Gif с помощью вызова команды Gifsicle в коде

Мне нужно запустить команду Gifsicle через JavaScript при разработке плагина для Sketch. Попытка преобразовать последовательность изображений PNG в анимированный GIF.

  1. Сначала я создаю временную папку с изображениями (работами)
  2. Затем запустил команду OSX sips, чтобы сделать процесс преобразования PNG в GIF и получил отдельные файлы GIF (работает)
  3. Затем попытайтесь использовать команду Gifsicle, чтобы создать анимированный GIF из отдельных файлов GIF в папке. Я получил только пустой анимированный GIF-файл от Gifsicle. (не удалось)

Вот код:

function convertPngToGif (exportFileName, exportFolder) {

// Create Temporary folder for conversion process
var fileManager = NSFileManager.defaultManager();
var uniqueID = NSProcessInfo.processInfo().globallyUniqueString();
var tmpPathUrl = NSTemporaryDirectory();
var tmpFolder = tmpPathUrl.stringByAppendingPathComponent(uniqueID);
fileManager.createDirectoryAtPath_withIntermediateDirectories_attributes_error(tmpFolder, true, null, null);

// Path to gifsicle
var gifConverter = utils.scriptLibraryPath + "/gifsicle";

// Create bash arguments
var convertGifImages = "find \"" + exportFolder + "\" -name '*.png' -exec sips -s format gif -o \"" + tmpFolder + "\" {}.gif {} \\;"
var convertGifAnimation = "find \"" + tmpFolder + "\" -name '*.gif' -execdir bash -c '\"" + gifConverter + "\" --delay=10 '*.gif' > \"" + exportFolder + '/' + exportFileName + '.gif' + "\"' \\;"

var convertTask = NSTask.alloc().init();
var createTask = NSTask.alloc().init();

// Create GIF Image Sequence from exist PNG images
convertTask.setLaunchPath("/bin/bash");
convertTask.setArguments(["-c", convertGifImages]);
convertTask.launch();
convertTask.waitUntilExit();

// Create GIF animation from converted images
createTask.setLaunchPath("/bin/bash");
createTask.setArguments(["-c", convertGifAnimation]);
createTask.launch();
createTask.waitUntilExit();

// Remove temporary folder
fileManager.removeItemAtPath_error_(tmpFolder, null);
}

Примечание во время тестирования: я пробовал команды Gifsicle. Он не создает этот пустой файл с помощью выходной команды '-o', но с помощью '>' он создает этот пустой файл.

Через терминал работает

Я пробовал через Терминал всю эту команду вручную, поскольку она появляется в строке функции, и она правильно создает анимированный GIF:

find "/GifImagesFolder/" -name '*.gif' -exec "/GifSicleFolder/gifsicle" --delay=10 *.gif -o "/OutputFolder/Example.gif" \;

Я думаю, что это связано с этой командой bash, потому что она работает через терминал, а не из кода.

1 ответ

Решение

Уже есть плагин Generate-GIF для Sketch, который использует этот рабочий процесс PNG для анимированных GIF и использует Gifsicle. Я снова протестировал его, но он больше не работает ни для меня в версии Sketch 3.4.2. Поэтому я понял, что использую старую версию AppStrore, потому что Sketch некоторое время назад отошел от AppStore. После обновления до новой версии Sketch 3.4.4 все работает правильно. Я не уверен, что это была настоящая проблема, потому что я помню, что раньше уже использовал экспорт GIF в Sketch.

В любом случае, правильный ответ лежит в вопросе. Извините за путаницу, но, возможно, это все равно поможет кому-то, если вы застряли с той же проблемой.

Другие вопросы по тегам