2016-04-21 116 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')); 
});