我正在使用 Meteor 的 collection-fs 包上传图像,并且我想使用 gm(readStrem).crop()
从每个图像的中心剪切缩略图。问题是,crop
的x
和y
偏移量取决于原始图像的大小,图像大小会有所不同,我不能使用相同的 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/