【问题标题】:graphicsmagick crop depending on original image size (resuse readstream)graphicsmagick 裁剪取决于原始图像大小(重用 readstream)
【发布时间】:2015-02-26 23:30:41
【问题描述】:

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

这会中断:

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 的第二次使用返回Error: gm().stream() or gm().write() with a non-readable stream

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

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

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

谢谢! 分贝

【问题讨论】:

    标签: node.js image-processing meteor graphicsmagick


    【解决方案1】:

    这可行且不依赖于客户端,因此更安全:

    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);
        });
      }
    );
    

    【讨论】:

      【解决方案2】:

      解决方案是在客户端确定文件大小,在写入之前将这些详细信息附加到fileObj,然后在写入期间在服务器上正常调用crop。

      var cropInfo = fileObj.cropInfo
      gm(readStream)
           .crop(cropInfo.width, cropInfo.height, cropInfo.x, cropInfo.y)
           .stream()
           .pipe(writeStream);
      

      不是很理想,但可以。

      【讨论】:

      • 我们需要在服务器端检查它,因为这可能对系统有害
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多