2016-07-07 8 views
2

У меня есть сервер Node, где вместо хранения обрезанных изображений я хочу обрезать их в ответ на вызов AJAX и отправить их клиенту таким образом. Я храню информацию о том, что урожай и как обрезать его в куки и тело. На сервере я обрезаю его, закодирую его в base64 и отправьте обратно пользователю. Вот как выглядит мой код:Изображение изображения на выходе из Graphics Magic для ответа без кодировки base64

res.set('Content-Type', 'image/jpeg'); 
gm(request(body.URL)) 
    .crop(req.cookies[name+"Width"],req.cookies[name+"Height"],req.cookies[name+"X"],req.cookies[name+"Y"]) 
    .stream(function streamOut (err, stdout, stderr) { 
     if (err) return next(err); 
     stdout.pipe(base64encode()).pipe(res); 
     stdout.on('error', next); 
    }); 

Это работает, но мне оно не нравится. Я мог только заставить это работать, закодировав его в base64, но на стороне клиента это кажется медленным, чтобы декодировать это на изображении. Я бы предпочел просто отправить изображение напрямую, но мне не удалось заставить его работать. Погружение изображения без декодирования привело к тарабарщинному ответу с сервера. Есть лучший способ сделать это? Или же несохраненное изображение должно быть закодировано для отправки?

+0

Вы пытались '.setFormat ('jpg') 'before' .crop()'? –

+0

setFormat ('jpg') привел к той же тарабарщине, что и раньше. Я не знаком с fs.createWriteStream, вы можете показать мне, как это будет выглядеть в моем коде? – master565

ответ

2

Я понятия не имею, как вы пишете node.js - все это похоже на кучу точек и круглых скобок для меня, но, используя то, что я знаю о командной строке GraphicsMagick, я пробовал это, и он делает то, что, я думаю, вы хотите, - что чтобы написать JPEG кодированного результат на stdout:

// Send header "Content-type: image/jpeg"... 

var gm = require('gm'); 
var input = 'input.jpg'; 

gm(input).resize(350).toBuffer('JPG',function (err, buffer) { 
    if (err) return handle(err); 
    process.stdout.write(buffer); 
}) 

Update

Рассматривали ли вы исключающие аспекты AJAX и просто с помощью статического src для вашего изображения, которое ссылается на node сценарий? Как я уже сказал, я не знаю node и Javascript но если создавать миниатюру с помощью PHP скрипт, я хотел бы добавить это в HTML

<img src="/php/thumb.php"/> 

Так что просто вызывает PHP скрипт для создания изображения. Если вы удалите /php/thumb.php и замените его, но вы указали сценарий node, который я предложил выше, он должен сказать вам, является ли проблема аспектом AJAX или GraphicsMagick ...

+0

Я сделаю это, когда вернусь домой. После получения ответа от сервера, есть ли что-то особенное, что мне нужно сделать, чтобы отобразить его на странице? Например, в настоящее время у меня просто есть обратный вызов AJAX, отредактируйте атрибут src с данными «: image/jpeg; base64« + response », чтобы отобразить его. – master565

+0

Что касается моего форматирования, я разбиваю каждый метод на новую строку, чтобы «обрезка» была отделена от «потока». Кроме этого, он выглядит довольно уродливым, потому что я использую несколько посредников, а аргументы для метода «crop» взяты из файлов cookie, которые я мог бы немного почистить, сохранив их в переменной с более полезной имя. Я не беспокоился об этом, прежде чем публиковать сообщения, потому что понимание этой части не было действительно релевантным для ответа на вопрос. – master565

+1

Я так не думаю, но я никогда не делал никаких «node.js», обычно у меня был бы элемент HTML 'img' с набором' src' для имени скрипта PHP, и он бы изменил изображение и отправил назад a * «Content-type: image/jpeg» *, за которым следуют данные, поэтому, я думаю, код выше будет почти таким же, и мы, надеюсь, будем работать. Я протестировал его, поставив выше в скрипте под названием 'script.js', а затем выполнив' node script.js> result.jpg', и изображение было правильным, поэтому я рад, что сценарий записывает JPEG на его 'stdout'. –