javascript - 在 Node js 下调整图像大小和裁剪的问题

标签 javascript node.js image multer lwip

我无法理解 Node js 中的图像处理。可悲的是,也很高兴这将是我申请的重要组成部分。

我想要实现的目标如下:

1) 用户上传图像(=> 多部分表单数据发送到包含所有数据的服务器。这很好用) 2) 将该图片的大小调整为最大宽度 640 像素。 3)从Y轴裁剪图片:some_variable到Y轴some_variable + max_height(240)和X轴:0到X轴640px 4)在服务器上保存它。

这是我目前使用multerlwip的悲惨方法

示例图片数据:

Files { fieldname: 'picture_data',
  originalname: 'dog-how-to-select-your-new-best-friend-thinkstock99062463.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: 'public/imgs/',
  filename: '1-picture_data-1453136557949.jpg',
  path: 'public/imgs/1-picture_data-1453136557949.jpg',
  size: 1790149 }

此数据由我的路由器在此函数中接收:

router.post('/someCall', upload.single('picture_data'), function(req, response) {
...
});

现在 multer 上传函数被调用:

var multer = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'public/imgs/');
  },
  filename: function (req, file, cb) {
    // CHECK IF FILE IS TOO BIG
    var fileSize = file.size;
    File_controller.checkFeedPostFileSize(fileSize, function(err, res){
      if(res == "File size ok"){
        var mimeType = file.mimetype;
        File_controller.checkMimeTypeImage(mimeType, function(err, res){
          // FILE IS OK AND MAY BE SAVED.
          if(res == "Mimetype ok"){
            var ending = ".jpg";
            if(mimeType == "image/jpeg"){
              ending = ".jpg";
            }else if(mimeType = "image/png"){
              ending = ".png";
            }
            var filename = req.session.user.id + "-" + file.fieldname + '-' + Date.now() + ending;
            req.session.user.file_name = filename;
            cb(null, filename);

            var path = 'public/imgs/' + req.session.user.filename;
            lwip.open(path, function(err, image){
              if (err) return console.log("LWIP BILD NICHT GEFUNDEN", err);
              image.resize(640, function(){

              });
            });
          }else{
            //response.send("Error: Mimetype not ok");
          }
        });
      }else{
        //response.send("Error: File size too big");
      }
    });
  }

});

现在,这种方法在 lwip 部分之前都有效。这意味着文件以其原始上传大小保存到服务器。据我了解,lwip 模块现在应该从服务器打开图像,然后调整其大小并再次保存。

这种方法非常尴尬,我相信它可以在保存并重新打开文件之前立即完成。但如果您以任何方式帮助我让它发挥作用,我将非常感激。

如果缺少任何信息来解决此问题,请告诉我。我会毫不犹豫地包含所有必要的内容。

谢谢

最佳答案

您应该在路由器处理程序中打开图像,一旦文件存在于文件系统上,就会调用该处理程序。 diskStorage 上的两个选项都会在文件完全上传之前调用。从 filename 中删除 lwip 部分,然后尝试类似的操作:

router.post('/someCall', upload.single('picture_data'), function(req, response) {

    lwip.open(req.file.path, function(err, image){

        image.batch()
            .resize(640)
            .writeFile('output.jpg', function(err){
                if (err){
                    response.status(400).send({ error: err.toString() });
                }
                else {
                    response.status(200).end();
                }
            }
        );
    });
});

关于javascript - 在 Node js 下调整图像大小和裁剪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860409/

相关文章:

javascript - NodeJs 事件调用函数

图像和数据矩阵

javascript - 全宽图像 slider

image - 流体图像的最大宽度和最大高度在 IE10 中不起作用

javascript - 是否有任何通用功能可以添加到所有类型的网络浏览器的收藏夹和主页?

javascript - 仅比较对象的某些位置

javascript - ES6 使用 --experimental-modules 在 Node 中导入

javascript - 如何在不影响其余页面样式的情况下加载带样式的 HTML 文件?

node.js - 解码 mongodump 的 stderr

javascript - Coffeescript重写功能