2016-04-21 114 views
0

我想使用gulp和imagemagick批量调整图像大小。因为我找不到imagemagick的当前gulp包装,所以我决定只通过exec在gulp中运行imagemagick。像这样:gulp:exec连续执行多个命令

gulp.task('images-large', function (cb) { 
    exec('mogrify -path .\\images\\large -scale "1920x1080^" -gravity north -crop 1920x1080+0+0 .\\raw_images\\*.*', function (err, stdout, stderr) { 
     console.log(stdout); 
     console.log(stderr); 
     cb(err); 
    }); 
}); 

gulp.task('images-medium', function (cb) { 
    exec('mogrify -path .\\images\\medium -scale "960x450^" -gravity north -crop 960x450+0+0 .\\raw_images\\*.*', function (err, stdout, stderr) { 
     console.log(stdout); 
     console.log(stderr); 
     cb(err); 
    }); 
}); 

上述TAKS的两个独立时运行做工精细,。各种大小的图像进入,回来制服。现在出现了这个问题。如果我结合了两个类似的任务:

gulp.task('image', [ 
    'image-large', 
    'image-medium' 
]); 

然后,大图像和中图像出来的随机大小。我猜Imagemagick不喜欢同时运行多个mogrify命令。也许是因为它实际上会暂时修改原始图像?这对我来说是个谜。

而不是与imagemagick(通常是一个失败的命题)斗争,我宁愿只是运行我的图像变换串行,大,然后中等。有没有办法在gulp中运行串口exec()命令?也就是说,等待一位执行官完成之后再运行下一个?

我想是这样的:

gulp.task('images-medium', ['images-large'], function (cb) {...}); 

可悲的是,图像仍然随机大小。

B计划是将imagemagick的东西移动到一个节点脚本,然后从gulp运行节点脚本,但是这是接近Rube Goldberg的领土,我不确定这是我的最佳选择。

不太可能,有什么我可以做imagemagick行为?

回答

1

尝试使用run-sequence。我对mogrify一无所知,但run-sequence将允许你将你的任务分成一组,但仍然按顺序/序列而不是并行运行它们。

+0

这没有奏效,可悲。图片仍然有随机大小。据猜测,只要吞咽完成并且不会在imagemagick上等待,回调就会发生。我很高兴知道'run-sequence'存在。 – crowhill

+0

嗯。当你分开运行它们并且它们工作时,即使吞咽任务认为它完成了,是否还有一些东西(如'mogrify')在后台运行?您可以在“run-sequence”任务之间添加某种超时,以排除一些奇怪的异步问题(我不建议永久保留它,但可能有助于排除故障)。 – dvlsg

+0

这当然是一个异步问题。我可以在创建文件时观看这些文件,并且中等图像与大图像交错(与运行序列没有区别)。我认为我期待吞咽成为它不是的东西。 – crowhill

-1

有一个吞咽包装,它被称为gulp-gm。最糟糕的情况是,如果它不起作用,那么会有general wrapper for gm/im,比exec()更容易和更清洁。使用一饮而尽通用的

例子:

var gulp = require('gulp'); 
var gm = require('gulp-gm'); 

gulp.task('default', function() { 
    gulp.src('test.png') 

    .pipe(gm(function(gmfile) { 
    return gmfile.resize(100, 100); 
    }, { 
    imageMagick: true 
    })) 

    .pipe(gulp.dest('dist')); 
});