Spaces:
Paused
Paused
| import Jimp from 'jimp'; | |
| import fs from 'fs/promises'; // Using promises for async/await compatibility | |
| import path from 'path'; // To handle file paths | |
| const __filename = new URL(import.meta.url).pathname; | |
| const __dirname = path.dirname(__filename); | |
| const generateProfilePictureWithWatermark = async (buffer) => { | |
| try { | |
| const jimp = await Jimp.read(buffer); | |
| const min = jimp.getWidth(); | |
| const max = jimp.getHeight(); | |
| const cropped = jimp.crop(0, 0, min, max); | |
| // Ensure the watermark path is correct | |
| const watermarkPath = path.resolve(__dirname, 'watermark.png'); | |
| // Check if watermark file exists | |
| try { | |
| await fs.access(watermarkPath); | |
| } catch (error) { | |
| throw new Error(`Watermark file not found at ${watermarkPath}`); | |
| } | |
| const watermarkBuffer = await fs.readFile(watermarkPath); | |
| const watermark = await Jimp.read(watermarkBuffer); | |
| // Resize the watermark to a larger size | |
| watermark.scaleToFit(200, 200); // Increase the size here | |
| // Calculate the position to place the watermark (bottom left corner) | |
| const x = 10; | |
| const y = cropped.bitmap.height - watermark.bitmap.height - 10; | |
| // Composite the watermark onto the profile picture | |
| cropped.composite(watermark, x, y); | |
| // Scale the profile picture to fit within 720x720 | |
| const scaledImg = await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG); | |
| return { | |
| img: scaledImg, | |
| preview: scaledImg, // Assuming the preview is the same as the profile picture | |
| }; | |
| } catch (error) { | |
| console.error('Error generating profile picture with watermark:', error); | |
| throw error; | |
| } | |
| }; | |
| export default generateProfilePictureWithWatermark; | |