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

时间:2016-01-10 12:58:25

标签: javascript macos bash gifsicle

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

  1. 首先我创建临时文件夹表单图像(作品)
  2. 然后运行OSX sips command以进行PNG到GIF转换过程并获得单个GIF文件(正常工作)
  3. 然后尝试使用Gifsicle命令从文件夹中的单个GIF文件制作动画GIF。我从Gifsicle获得了空的动画GIF文件。 (失败)
  4. 这是代码:

    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 commands。它不会使用输出' -o' 命令创建该空文件,但使用'>' 它将创建该空文件。

    通过终端工作

    我已尝试通过终端手动完成整个命令,因为它出现在函数字符串中,并且它正确地创建了动画GIF:

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

    我猜它与bash命令有关,因为它通过终端而不是代码工作。

1 个答案:

答案 0 :(得分:0)

Sketch已经有一个名为Generate-GIF的插件,它将此PNG用于动画GIF工作流并使用Gifsicle。我再次测试了它,但它在Sketch 3.4.2版本中不再适用于我。所以我意识到我使用的是旧的AppStrore版本because Sketch moved away from AppStore a while ago。更新到新的Sketch 3.4.4版本后,一切正常。我不确定这是否是实际问题,因为我记得我之前已经在Sketch中使用过GIF。

无论如何,正确答案在于问题。抱歉令人困惑,但如果遇到同样的问题,这可能仍然对某人有帮助。

相关问题