- Add storage.ts with directory management and file I/O - Add thumbnails.ts with EXIF-aware thumbnail generation - Thumbnails always output as JPEG with 80% quality
24 lines
675 B
TypeScript
24 lines
675 B
TypeScript
import sharp from 'sharp';
|
|
|
|
/**
|
|
* Generate a thumbnail from an image buffer
|
|
*
|
|
* CRITICAL: Uses sharp.rotate() first to handle EXIF orientation from mobile photos.
|
|
* Without this, photos taken in portrait mode may appear rotated.
|
|
*
|
|
* @param buffer - Original image buffer
|
|
* @param size - Thumbnail size (default 150px)
|
|
* @returns Thumbnail buffer as JPEG
|
|
*/
|
|
export async function generateThumbnail(buffer: Buffer, size: number = 150): Promise<Buffer> {
|
|
return sharp(buffer)
|
|
.rotate() // Auto-rotate based on EXIF orientation
|
|
.resize(size, size, {
|
|
fit: 'cover',
|
|
position: 'center',
|
|
withoutEnlargement: true
|
|
})
|
|
.jpeg({ quality: 80 })
|
|
.toBuffer();
|
|
}
|