库存溢出 -
我正在尝试使用 NodeJS 处理图像集合(~2000 张图像)。我能够提取所需的信息,但很难找到正确的时机,以便将结果保存到 JSON
文件中。
最后你会看到
console.log(palette);
// Push single image data to output array.
output.push(palette);
console.log 工作正常,但 push
方法似乎是在将空 output
数组写入 data.json
后执行的。尝试有一个嵌套的 promise ,在处理所有图像之前我不会写入文件。
getPixels 中的回调函数异步执行。
输出数组的顺序是任意的。
非常感谢任何和所有帮助!谢谢!
// 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.');
});
最佳答案
你想要做的是将“图像”数组转换为 promise 数组并等待all promises解决,然后进行更多的转换。将其视为一系列转换,因为这就是您在这里所做的事情。简而言之:
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)
};
});
关于javascript - NodeJS/Javascript - 使用 Promise 处理图像收集然后保存聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46458681/