javascript - NodeJS/Javascript - 使用 Promise 处理图像收集然后保存聚合结果

标签 javascript node.js asynchronous ecmascript-6 es6-promise

库存溢出 -

我正在尝试使用 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/

相关文章:

javascript - 错误: No package 'cairo' found on ec2 bitnami MEAN server

javascript - 如何运行encodeURIComponent但有一个异常?

node.js - Docker Container npm全局影响主机还是仅容器?

javascript - 如何让 Express 在使用 res.render 时自动设置 Content-Type?

asynchronous - Vuex:计算属性返回未定义 - asyc Axios

python - Python中的 `await`是否会屈服于事件循环?

javascript - 使用.map时如何获取不可变列表中的下一个元素?

javascript - 如何使用 HTML2Canvas 为 jQuery 元素截取屏幕截图?

javascript - 从 node.js 上传文件到 Dropbox

java - 顶点抛出 IllegalStateException : Response has already been written