graphicsmagick裁剪取决于原始图像大小(resuse readstream)
我使用Meteor的collection-fs包来上传图片,并且我想用gm(readStrem).crop()
从每个图片的中心剪下一个缩略图。 问题是, crop
的x
和y
偏移量取决于原始图像的大小,图像大小会有所不同,我不能使用相同的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
这工作,并不依赖于客户端,这使得它更安全:
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);
不太理想,但它的作品。