in source/use_cases/aws-serverless-image-handler/lib/lambda/image-handler/image-handler.js [44:130]
async applyEdits(originalImage, edits) {
if (edits.resize === undefined) {
edits.resize = {};
edits.resize.fit = 'inside';
}
const image = sharp(originalImage, { failOnError: false });
const metadata = await image.metadata();
const keys = Object.keys(edits);
const values = Object.values(edits);
// Apply the image edits
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const value = values[i];
if (key === 'overlayWith') {
let imageMetadata = metadata;
if (edits.resize) {
let imageBuffer = await image.toBuffer();
imageMetadata = await sharp(imageBuffer).resize({ edits: { resize: edits.resize }}).metadata();
}
const { bucket, key, wRatio, hRatio, alpha } = value;
const overlay = await this.getOverlayImage(bucket, key, wRatio, hRatio, alpha, imageMetadata);
const overlayMetadata = await sharp(overlay).metadata();
let { options } = value;
if (options) {
if (options.left) {
let left = options.left;
if (left.endsWith('p')) {
left = parseInt(left.replace('p', ''));
if (left < 0) {
left = imageMetadata.width + (imageMetadata.width * left / 100) - overlayMetadata.width;
} else {
left = imageMetadata.width * left / 100;
}
} else {
left = parseInt(left);
if (left < 0) {
left = imageMetadata.width + left - overlayMetadata.width;
}
}
options.left = parseInt(left);
}
if (options.top) {
let top = options.top;
if (top.endsWith('p')) {
top = parseInt(top.replace('p', ''));
if (top < 0) {
top = imageMetadata.height + (imageMetadata.height * top / 100) - overlayMetadata.height;
} else {
top = imageMetadata.height * top / 100;
}
} else {
top = parseInt(top);
if (top < 0) {
top = imageMetadata.height + top - overlayMetadata.height;
}
}
options.top = parseInt(top);
}
}
const params = [{ ...options, input: overlay }];
image.composite(params);
} else if (key === 'smartCrop') {
const options = value;
const imageBuffer = await image.toBuffer();
const boundingBox = await this.getBoundingBox(imageBuffer, options.faceIndex);
const cropArea = this.getCropArea(boundingBox, options, metadata);
try {
image.extract(cropArea)
} catch (err) {
throw ({
status: 400,
code: 'SmartCrop::PaddingOutOfBounds',
message: 'The padding value you provided exceeds the boundaries of the original image. Please try choosing a smaller value or applying padding via Sharp for greater specificity.'
});
}
} else {
image[key](value);
}
}
// Return the modified image
return image;
}