2015-02-26 2 views
1

Я использую пакеты коллекции meteor для загрузки изображений, и я хочу вырезать миниатюру из центра каждого изображения, используя gm(readStrem).crop(). Проблема заключается в том, что смещения x и y для crop зависят от размера исходного изображения, размеры изображения могут различаться, и я не могу использовать один и тот же файл reasdStream дважды.graphicsmagick crop в зависимости от исходного размера изображения (resuse 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 возвращает Error: gm().stream() or gm().write() with a non-readable stream

Я видел несколько других ответов, связанных с этим, но никто не поможет мне, потому что пакет заставляет меня pipe(writeStream); Я не могу просто сделать «.writeAsync()» Я пробовал всякие другие трюки, которые не работают, в том числе:

  • клонировании поток, чтобы получить размер, а затем использовать оригинал для синхронного преобразования и сохранить (в таймере)
  • вызова все это синхронно (глупая идея, но стоит выстрел)

Если кто-нибудь имеет какие-либо идеи, я действительно ценю ваш вклад.

Спасибо! db

ответ

0

Решение заключалось в определении размера файла на клиенте, добавлении этих деталей в файлObj перед записью, а затем вызове обрезания на сервере во время записи.

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

Не совсем идеальный, но он работает.

+0

Мы должны проверить его на стороне сервера, так как это может вредно для системы –

2

Это работает и не зависит от клиента, что делает его более безопасным:

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); 
    }); 
    } 
); 
Смежные вопросы