graphicsmagick裁剪取决于原始图像大小(resuse readstream)

我使用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()'我尝试了各种其他技巧,不起作用,包括:

  • 克隆stream获取大小,然后使用原来的同步转换和保存(在一个计时器)
  • 同时调用整个事物(愚蠢的想法,但值得一试)

如果有人有任何想法,我会很感激你的意见。

谢谢! D b

       

网上收集的解决方案 "graphicsmagick裁剪取决于原始图像大小(resuse readstream)"

这工作,并不依赖于客户端,这使得它更安全:

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

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

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

不太理想,但它的作品。