mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-08-15 17:10:18 -04:00
Merge remote-tracking branch 'upstream/release-v1.45'
This commit is contained in:
commit
80adb0a6ca
196 changed files with 4122 additions and 2177 deletions
|
@ -61,9 +61,19 @@ class Thumbnailer:
|
|||
self.transpose_method = None
|
||||
try:
|
||||
# We don't use ImageOps.exif_transpose since it crashes with big EXIF
|
||||
image_exif = self.image._getexif()
|
||||
#
|
||||
# Ignore safety: Pillow seems to acknowledge that this method is
|
||||
# "private, experimental, but generally widely used". Pillow 6
|
||||
# includes a public getexif() method (no underscore) that we might
|
||||
# consider using instead when we can bump that dependency.
|
||||
#
|
||||
# At the time of writing, Debian buster (currently oldstable)
|
||||
# provides version 5.4.1. It's expected to EOL in mid-2022, see
|
||||
# https://wiki.debian.org/DebianReleases#Production_Releases
|
||||
image_exif = self.image._getexif() # type: ignore
|
||||
if image_exif is not None:
|
||||
image_orientation = image_exif.get(EXIF_ORIENTATION_TAG)
|
||||
assert isinstance(image_orientation, int)
|
||||
self.transpose_method = EXIF_TRANSPOSE_MAPPINGS.get(image_orientation)
|
||||
except Exception as e:
|
||||
# A lot of parsing errors can happen when parsing EXIF
|
||||
|
@ -76,7 +86,10 @@ class Thumbnailer:
|
|||
A tuple containing the new image size in pixels as (width, height).
|
||||
"""
|
||||
if self.transpose_method is not None:
|
||||
self.image = self.image.transpose(self.transpose_method)
|
||||
# Safety: `transpose` takes an int rather than e.g. an IntEnum.
|
||||
# self.transpose_method is set above to be a value in
|
||||
# EXIF_TRANSPOSE_MAPPINGS, and that only contains correct values.
|
||||
self.image = self.image.transpose(self.transpose_method) # type: ignore[arg-type]
|
||||
self.width, self.height = self.image.size
|
||||
self.transpose_method = None
|
||||
# We don't need EXIF any more
|
||||
|
@ -101,7 +114,7 @@ class Thumbnailer:
|
|||
else:
|
||||
return (max_height * self.width) // self.height, max_height
|
||||
|
||||
def _resize(self, width: int, height: int) -> Image:
|
||||
def _resize(self, width: int, height: int) -> Image.Image:
|
||||
# 1-bit or 8-bit color palette images need converting to RGB
|
||||
# otherwise they will be scaled using nearest neighbour which
|
||||
# looks awful.
|
||||
|
@ -151,7 +164,7 @@ class Thumbnailer:
|
|||
cropped = scaled_image.crop((crop_left, 0, crop_right, height))
|
||||
return self._encode_image(cropped, output_type)
|
||||
|
||||
def _encode_image(self, output_image: Image, output_type: str) -> BytesIO:
|
||||
def _encode_image(self, output_image: Image.Image, output_type: str) -> BytesIO:
|
||||
output_bytes_io = BytesIO()
|
||||
fmt = self.FORMATS[output_type]
|
||||
if fmt == "JPEG":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue