diff --git a/CHANGES.md b/CHANGES.md index 5f18bb47..0ea15e72 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,11 @@ Version 0.3.2 To be released. + - Fixed a bug where generated thumbnails had not copied the EXIF orientation + metadata from the original image. [[#76]] + +[#76]: https://github.com/dahlia/hollo/issues/76 + Version 0.3.1 ------------- diff --git a/src/media.ts b/src/media.ts index 8abf0f73..9b209cc0 100644 --- a/src/media.ts +++ b/src/media.ts @@ -22,12 +22,21 @@ export async function uploadThumbnail( thumbnailArea = DEFAULT_THUMBNAIL_AREA, ): Promise { const originalMetadata = await original.metadata(); - const thumbnailSize = calculateThumbnailSize( - originalMetadata.width!, - originalMetadata.height!, - thumbnailArea, - ); - const thumbnail = await original.resize(thumbnailSize).webp().toBuffer(); + let width = originalMetadata.width!; + let height = originalMetadata.height!; + if (originalMetadata.orientation !== 1) { + // biome-ignore lint/style/noParameterAssign: + original = original.clone(); + original.rotate(); + if (originalMetadata.orientation !== 3) { + [width, height] = [height, width]; + } + } + const thumbnailSize = calculateThumbnailSize(width, height, thumbnailArea); + const thumbnail = await original + .resize(thumbnailSize) + .webp({ nearLossless: true }) + .toBuffer(); const content = new Uint8Array(thumbnail); try { await disk.put(`media/${id}/thumbnail.webp`, content, {