通过调用代码中的Gifsicle命令将PNG转换为动画Gif



在为Sketch开发插件时,我需要通过JavaScript运行Gifsicle命令。正在尝试将PNG图像序列转换为GIF动画。

  1. 首先我创建临时文件夹表单图像(作品)
  2. 然后运行OSX sips命令进行PNG到GIF的转换过程,得到单个GIF文件(工作)
  3. 然后尝试使用Gifsicle命令从文件夹中的单个GIF文件制作动画GIF。我只从Gifsicle得到了一个空的GIF动画文件。(失败)

这是代码:

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命令有关,因为它通过终端工作,而不是通过代码工作。

已经有一个名为Generate GIF for Sketch的插件,它使用这种PNG到动画GIF的工作流并使用Gifsicle。我再次测试了它,但在草图3.4.2版本中,它对我来说都不起作用。所以我意识到我使用的是旧的AppStrore版本,因为Sketch不久前就离开了AppStore。更新到新的草图3.4.4版本后,一切正常。我不确定这是否是真正的问题,因为我记得我以前在Sketch中已经使用过GIF导出。

不管怎样,正确的答案就在这个问题之内。很抱歉让人感到困惑,但如果遇到同样的问题,也许这仍然会对某人有所帮助。

最新更新