如何在javascript中缩放多个图像?

时间:2014-08-03 20:46:09

标签: javascript json xmlhttprequest parse-platform getjson

我有这种方法在将图像保存到parse.com数据库并将其缩小之前抓取图像。

看一下代码:

var Image = require("parse-image"); // module
Parse.Cloud.beforeSave("Garments", function(request, response) {
      Parse.Cloud.httpRequest({
        url: request.object.get("image").url()
      }).then(function(response) {
        var image = new Image();
        return image.setData(response.buffer);

      }).then(function(image) {
        // Resize the image.
        return image.scale({
          width: 300,
          height: 450
        });

      }).then(function(image) {
        // Make sure it's a JPEG to save disk space and bandwidth.
        return image.setFormat("JPEG");

      }).then(function(image) {
        // Get the image data in a Buffer.
        return image.data();

      }).then(function(buffer) {
        // Save the image into a new file.
        var base64 = buffer.toString("base64");
        var cropped = new Parse.File("image.jpg", { base64: base64 });
        return cropped.save();

      }).then(function(cropped) {
        // Attach the image file to the original object.
        request.object.set("image", cropped);

      }).then(function(result) {
        response.success();
      }, function(error) {
        response.error(error);
      });
});

问题:

是否可以再为5张图片做以上操作?

我共有6个图片列。

image,image2,image3,image4,image5,image6

如果没有填充“image”列,则行将永远不存在。其他图像是可选的。因此,当缩放时我需要继续并缩放“图像”,如果不存在image2,image3,image4,image5和image6,则不会抛出任何错误。如果它们确实存在,那么也将它们缩小。

我正坐在这里试图想出一种有效的编码方式。如果一个javascript专家想出一些东西,我真的很感激。

我觉得我再也不会重复这段代码了。

感谢您的时间

1 个答案:

答案 0 :(得分:1)

将大部分代码转换为返回最终承诺的函数,并使用Parse.Promise.when()等待一系列承诺完成,这里有一些让你入门:

var imagePromises = [];

var garment = request.object;

// you said "image" is always populated, so always add it
imagePromises.push(createImagePromise(garment, "image", garment.get("image").url()));

// now conditionally add the other promises, using a loop to further reduce repeated code
for (var i = 2; i < 7; i++) {
    var imageColumn = "image" + i;
    if (garment.get(imageColumn) && garment.get(imageColumn).url()) {
        imagePromises.push(createImagePromise(garment, imageColumn, garment.get(imageColumn).url()));
    }
}

// now we have all the promises, wait for them all to finish before we're done
Parse.Promise.when(imagePromises).then(function () {
    response.success();
}, function (error) {
    response.error(error);
});

唯一的最后一部分是制作createImagePromise()功能。

function createImagePromise(garment, imageColumn, url) {
    // we want to return the promise
    return Parse.Cloud.httpRequest({
        url: url
    }).then(function (response) {
        // ... etc ...
    }).then(function (cropped) {
        // Attach the image file to the original object.
        garment.set(imageColumn, cropped);
    });
}

注:

允许运行的时间有limitbeforeSave只有 3秒才能终止运行,这可能不够长处理6张图片。