【问题标题】:Can I use node-gm to resize an image in memory or do I need to save it first?我可以使用 node-gm 调整内存中的图像大小还是需要先保存它?
【发布时间】:2013-06-19 08:34:10
【问题描述】:

我允许用户上传头像,但我想在上传头像时调整它们的大小。现在,gm 似乎让我在调整文件大小之前先将文件保存到磁盘。是否可以在传入请求进入时调整它的大小?

类似这样的:

 var readStream = fs.createReadStream(req.files['profile-picture']['path']);

 gm(req.files['profile-picture']['path'], 'img.jpg')
 .write('/path/to/directory/img.jpg', function (err) {
   if (!err) console.log('done');
 });

【问题讨论】:

    标签: javascript node.js image-processing image-uploading graphicsmagick


    【解决方案1】:

    您可以只通过 gm 管道传输流,而无需将文件保存到光盘!您甚至可以一个接一个地执行多个操作,因为 gm 函数是可链接的(在我的示例中,我调整了图像的大小,然后从中间裁剪它(因此是重力函数)

    gm(req.files['profile-picture']['path'], 'img.jpg')
      .resize("100^", "100^")
      .gravity('Center')
      .crop(100, 100)
      .stream(function (err, stdout, stderr) {
         // do whatever you want with your output stream (stdout) here
      });
    

    【讨论】:

    • 您的示例中的 http.get('your-image-url') 从磁盘中获取它,不是吗?如果不是,请解释一下。
    • 啊我的错,你没有尝试从远程获取,你正在上传。那应该更容易。我会修正我的答案。
    • 这不起作用:gm(req.files['profile-picture']['path'], 'img.jpg').resize("100^", "100^").gravity('Center').crop(100, 100).stream(function (err, stdout, stderr) { stdout.pipe(fs.createWriteStream('/uploads/' + 'img.jpg')); }); 给我以下错误:events.js:71 throw arguments[1]; // Unhandled 'error' event ^ Error: ENOENT, open '/uploads/img.jpg'
    • 所以 req.files['profile_picture']['path'] 只是一个字符串。这需要是一个可以工作的流对象。看这篇文章:componentix.com/blog/13/file-uploads-using-nodejs-once-again,parse_multipart-method 可能是你需要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2011-10-24
    • 2010-10-12
    • 1970-01-01
    • 2015-11-14
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多