NodeJS / Javascript – 使用承诺来处理图像收集,然后保存汇总的结果
股票溢价 –
我试图用NodeJS处理图像集合(〜2000图像)。 我能够提取所需的信息,但我很难得到正确的时间,以便将结果保存到JSON
文件。
接近尾声,你会看到
console.log(palette); // Push single image data to output array. output.push(palette);
console.log
工作正常,但是在将空的output
数组写入data.json
之后,似乎执行了push
方法。 试过有一个嵌套的承诺,我不会写文件,直到所有的图像已被处理。
getPixels中的callback函数是asynchronous执行的。
输出数组的顺序是任意的。
任何和所有帮助非常感谢! 谢谢!
// Extract color information from all images in imageDirectory var convert = require('color-convert'), fs = require('fs'), getPixels = require("get-pixels"), startTime = Date.now(); var processedImages = new Promise((resolve, reject) => { var imageDirectory = 'input', images = fs.readdirSync(imageDirectory), output = []; console.log('Found ' + images.length + ' images.'); for (var image in images) { var imageLoaded = new Promise((resolve, reject) => { getPixels(imageDirectory + '/' + images[image], function(error, pixels) { if(error) { return 'Bad image path'; } resolve(pixels); }); }); imageLoaded.then((pixels) => { var palette = { coloredPixels : 0, hues : [], image : images[image], classification : false, pixelCount : null }; palette.pixelCount = pixels.shape[0] * pixels.shape[1] * pixels.shape[2]; for (var i = 0; i < 256; i++) { palette.hues[i] = 0; } for (var i = 0; i < palette.pixelCount; i += 4) { var rgb = [pixels.data[i ], pixels.data[i + 1], pixels.data[i + 2]], hsl = convert.rgb.hsl(rgb), hue = hsl[0], saturation = hsl[1]; if (saturation) { palette.hues[hue]++; palette.coloredPixels++; } } console.log(palette); // Push single image data to output array. output.push(palette); }); } resolve(output); }); processedImages.then((output) => { // write output array to data.json var json = JSON.stringify(output, null, 2); fs.writeFileSync('data.json', json); // Calculate time spent var endTime = Date.now(); console.log('Finished in ' + (endTime - startTime) / 1000 + ' seconds.'); });
你想要做的是将一系列“图像”转换为一组承诺,并等待所有的承诺解决,然后执行更多的转换。 把它看作是一系列的转变,因为这就是你在这里做的。 简而言之:
const imagePromises = images.map(image => new Promise(resolve, reject) { getPixels(imageDirectory + '/' + image, (error, pixels) => { if(error) { reject('Bad image path'); return; } resolve(pixels); }); const output = Promise.all(imagePromises).then(results => results.map(pixels => { return { // do your crazy palette stuff (build a palette object) }; });