node.js - 根据原始图像大小进行 GraphicsMagick 裁剪(重新使用读取流)

标签 node.js image-processing meteor graphicsmagick

我正在使用 Meteor 的 collection-fs 包上传图像,并且我想使用 gm(readStrem).crop() 从每个图像的中心剪切缩略图。问题是,cropxy偏移量取决于原始图像的大小,图像大小会有所不同,我不能使用相同的 readStream 两次。

这会破坏:

var xOff = 0;
var yOff = 0;
var thumbnailWidth = 450;
var thumbnailHeight = 600;
gm(readStream).size(function (err, dimensions) {
   if ( dimensions ) {
     xOff = (dimensions.width - thumbnailWidth) / 2;
     yOff = (dimensions.height - thumbnailHeight) / 2;
   }
   gm(readStream)
     .crop(thumbnailWidth, thumbnailHeight, xOff, yOff)
     .stream()
     .pipe(writeStream);
})

维度返回,但第二次使用 readStream 返回错误:gm().stream() 或 gm().write() 具有不可读的流

我已经看到了一些与此相关的其他答案,但没有一个对我有帮助,因为该包强制我 pipe(writeStream);我不能只做“.writeAsync()”,我尝试了各种其他不起作用的技巧,包括:

  • 克隆流以获取大小,然后使用原始流进行同步转换并保存(在计时器中)
  • 同步调用整个过程(愚蠢的想法,但值得一试)

如果有人有任何想法,我非常感谢您的意见。

谢谢! 数据库

最佳答案

这有效并且不依赖于客户端,这使得它更安全:

var xOff = 0;
var yOff = 0;
var thumbnailWidth = 450;
var thumbnailHeight = 600;
gm(readStream, fileObj.name()).size(
  {bufferStream: true},
  function (err, dimensions) {
    if (dimensions) {
      xOff = (dimensions.width - thumbnailWidth) / 2;
      yOff = (dimensions.height - thumbnailHeight) / 2;
    }
    this.crop(thumbnailWidth, thumbnailHeight, xOff, yOff);
    this.stream((err, stdout, stderr) => {
      stdout.pipe(writeStream);
    });
  }
);

关于node.js - 根据原始图像大小进行 GraphicsMagick 裁剪(重新使用读取流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754847/

相关文章:

node.js - Passport.js 失败重定向何时发生?

node.js - 如何从同一局域网中的远程计算机访问 Node 服务器

node.js - Mongoose/MongoDb 在数组中查找具有反向引用的文档

c# - 使用 Emgucv 比较两个图像

javascript - 在 Meteor 中创建同步倒计时

node.js - mongodb 和 EventEmitter 之间的问题

algorithm - 使用图像处理计算弯管的曲率(霍夫变换抛物线检测)

c++ - SSE/优化 - 将数组复制到更大的数组

node.js - 主机名/IP 与证书的替代名称不匹配 [Meteor JS 电子邮件]

javascript - 使用 EnsureIndex 获取 Meteor 中出版物中的位置