NodeJS gm получает размер изображения синхронно

Я использую GM и пытаюсь обрабатывать изображения в соответствии с его размером. Так как метод "size" нуждается в функции обратного вызова, я не могу использовать размер в следующих строках.

Что я хочу сделать, это так:

function processImage(url) {
    var img = gm(this.getImgStream(url));

    var width, height;
    img.size(function(err, val) {
        width = val.width;
        height = val.height;
    });

    // I want to use width here, but it's undefined when this line is executed.
    if (width > 500) width = 500;
    return img.resize(width)
}

Я хочу использовать ширину в следующем методе изменения размера. Есть ли способ получить размер синхронно или дождаться завершения обратного вызова? Я не хочу использовать ивары как можно дольше.

3 ответа

Решение

Поскольку img.size() является асинхронным, вы не можете выполнять операцию синхронно (что означает, что вы также не можете использовать return для возвращаемого значения). Поэтому вам нужно img.size() закончить, прежде чем вы сможете сделать что-нибудь еще. Вы можете назначить обратный вызов внутри операции или передать обратные вызовы:

function processImage(url, callback) {
  var img = gm(this.getImgStream(url));

  var width, height;
  img.size(function(err, val) {
    width = val.width;
    height = val.height;

    callback(err, width, height);
  });
};

processImage(url, function(err, width, height) {
  if (width > 500) width = 500;
  img.resize(width);
});

Вы можете использовать пакет "image-size" npm

var sizeOf = require('image-size');
var dimensions = sizeOf("/pathofimage/image.jpg");
console.log(dimensions.width, dimensions.height);

Вы также можете обернуть функцию GM size() обещанием сделать ее асинхронной.

      async getImageSize() {
    return new Promise((resolve, reject) => {
        gm(imageFilePath)
        .size((error, size) => {
            if (error) {
                console.error('Failed to get image size:', error);
                reject(error);
            } else {
                resolve(size);
            }
        });
    });
}

// Get the image size synchronously:
const size = await this.getImageSize();
console.log("Parent got size of " + size.width);
Другие вопросы по тегам