Рассмотрим сценарий, в котором я хочу добавить водяной знак в разных местах изображения и сгенерировать отдельные копии каждого из них.
Изображения загружаются в AWS S3.
const AWS = require('aws-sdk');
const Jimp = require('jimp');
Я использую AWS SDK для извлечения этих изображений в качестве буфера
const dynamoS3Bucket = new AWS.S3();
let a = dynamoS3Bucket.getObject({ Bucket: 'bucket.name', Key: 'raw_uploads/Sample-image10-highres.jpg' }).promise();
let b = dynamoS3Bucket.getObject({ Bucket: 'bucket.name', Key: 'raw_uploads/Sample-image10-highres.jpg' }).promise();
Теперь я пытаюсь добавить водяной знак , где a - это изображение, b - это логотип
Promise.all([a, b]).then(async resp => {
let aa = watermark(30, resp[0].Body, resp[1].Body, 0, 1);
let bb = watermark(30, resp[0].Body, resp[1].Body, 1, 0);
return Promise.all([aa, bb]);
}).then(respArr => {
return respArr[1].writeAsync('fileName2.jpg');
});
Функция watermark работает следующим образом:
async function watermark(percent = 10, base, logo, x_axis = 0, y_axis = 0){
percent = Math.ceil(percent);
if(percent > 70) percent = 70;
baseIMG = await Jimp.read(base);
logoIMG = await Jimp.read(logo);
logoIMG = await logoIMG.resize(Math.ceil(baseIMG.bitmap.width * percent / 100), Jimp.AUTO, Jimp.RESIZE_BEZIER);
x_axis = Math.ceil(x_axis);
y_axis = Math.ceil(y_axis);
if(x_axis !== 0) x_axis = x_axis/Math.abs(x_axis);
if(y_axis !== 0) y_axis = y_axis/Math.abs(y_axis);
console.log({percent, baseIMG, logoIMG, x_axis, y_axis });
if(x_axis === 0) x_axis = Math.ceil((baseIMG.bitmap.width - logoIMG.bitmap.width)/2)
else if (x_axis === 1) x_axis = Math.ceil(baseIMG.bitmap.width - logoIMG.bitmap.width)
else x_axis = 0;
if(y_axis === 0) y_axis = Math.ceil((baseIMG.bitmap.height - logoIMG.bitmap.height)/2)
else if (y_axis === -1) y_axis = Math.ceil(baseIMG.bitmap.height - logoIMG.bitmap.height)
else y_axis = 0;
return baseIMG.composite(logoIMG, x_axis, y_axis, {
mode: Jimp.BLEND_SOURCE_OVER,
opacitySource: 0.4,
opacityDest: 0.3
});
}
Проблема : первое обработанное изображение отлично, если второе изображение имеет 2 водяных знака и выглядит как показано ниже.
Я пытался решить проблему, обрабатывая по одному изображению за раз вложенными обещаниями вместо Promise.all () .Есть ли какой-нибудь возможный способ добиться этого или какое-либо объяснение, почему это может происходить?