как вставить изображение в ответ JSON
Я использую Jimp
для чтения строки JSON, которая выглядит так:
Как видите, image
node - это JPEG в кодировке base64.
Я могу успешно преобразовать его в TIFF и сохранить:
Jimp.read(Buffer.from(inputImage, "base64"), function(err, image) {
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
context.bindings.outputBlob = tiff
...}
Однако когда я попытался встроить tiff
внутри объекта JSON TIFF искажается:
const response = {
image: tiff.toString('base64'),
correlation: correlation
};
context.bindings.outputBlob = response;
Вот полный код:
const Jimp = require("jimp");
module.exports = function(context, myBlob) {
const correlation = context.bindings.inputBlob.correlation;
const inputImage = context.bindings.inputBlob.image;
const imageName = context.bindings.inputBlob.imageName;
context.log(
correlation + "Attempting to convert this image to a tiff: " + imageName
);
Jimp.read(Buffer.from(inputImage, "base64"), function(err, image) {
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
const response = {
image: tiff.toString('base64'),
correlation: correlation
};
context.bindings.outputBlob = response;
context.log(
correlation + "Succesfully converted " + imageName + " to tiff."
);
context.done();
});
});
};
Как нам встроить tiff в полезную нагрузку JSON?
Если этот вывод не подлежит обсуждению, как мне отобразить tiff из сохраненной полезной нагрузки?
0 ответов
Что ж, поскольку вы подтвердили, что ищете вывод с помощью context.res, вот мой рабочий образец... обратите внимание, что существует максимальный размер ответа, поэтому вы не можете вернуть каждое изображение / файл так, как я возвращаю изображение здесь
const Jimp = require('jimp')
module.exports = async function (context, req)
{
let response = {}
try
{
//create axios connection to azure photo storage
let url = 'https://noahwriting.com/wp-content/uploads/2018/06/APPLE-300x286.jpg'
//call function to download and resize image
response = await resizeImage(url)
}
catch (err)
{
response.type = 'application/json'
if (err.response == undefined)
{
context.log(err)
response.status = 500
response.data = err
}
else
{
response.data = err.response.data
response.status = err.response.status
context.log(response)
}
}
//response
context.res =
{
headers: { 'Content-Type': `${response.type}` },
body: response.buf
}
}
async function resizeImage(url)
{
//read image to buffer
let image = await Jimp.read(url)
//resize image
image.resize(300, Jimp.AUTO)
//save to buffer
let image_buf = await image.getBufferAsync(image.getMIME())
//image.getMIME() returns something like `image/jpeg` which is a valid Content-Type for responses.
return { 'buf': image_buf, 'type': image.getMIME() }
}
(Оффтоп, но я видел, что вы используете хранилище BLOB-объектов, поэтому...) если вы планируете хранить фотографии / файлы / что-либо в хранилище BLOB-объектов Azure и хотите получать их систематическим способом, вы очень быстро обнаружите, что не можете запросите хранилище, и вам придется иметь дело с уродливым XML. Я стараюсь избежать этого способа создания функции, которая хранит фотографии / файлы в хранилище BLOB-объектов, но затем сохраняет URL-путь к файлу вместе с именем файла и любыми другими атрибутами в хранилище mongo. Таким образом, я могу делать сверхбыстрые запросы для получения массива ссылок, указывающих на соответствующие файлы.