diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2021-03-09 07:37:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-09 07:37:09 -0500 |
commit | 075c16b4103e7368e304496f3016d3b826b3ee92 (patch) | |
tree | 59aabbcaa019b7953f8d73e6d53d4e0848bfd1ec /synapse/rest/media | |
parent | Add a list of hashes to ignore during git blame. (#9560) (diff) | |
download | synapse-075c16b4103e7368e304496f3016d3b826b3ee92.tar.xz |
Handle image transparency better when thumbnailing. (#9473)
Properly uses RGBA mode for 1- and 8-bit images with transparency (instead of RBG mode).
Diffstat (limited to 'synapse/rest/media')
-rw-r--r-- | synapse/rest/media/v1/thumbnailer.py | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/synapse/rest/media/v1/thumbnailer.py b/synapse/rest/media/v1/thumbnailer.py index 07903e4017..988f52c78f 100644 --- a/synapse/rest/media/v1/thumbnailer.py +++ b/synapse/rest/media/v1/thumbnailer.py @@ -96,9 +96,14 @@ class Thumbnailer: def _resize(self, width: int, height: int) -> Image: # 1-bit or 8-bit color palette images need converting to RGB # otherwise they will be scaled using nearest neighbour which - # looks awful - if self.image.mode in ["1", "P"]: - self.image = self.image.convert("RGB") + # looks awful. + # + # If the image has transparency, use RGBA instead. + if self.image.mode in ["1", "L", "P"]: + mode = "RGB" + if self.image.info.get("transparency", None) is not None: + mode = "RGBA" + self.image = self.image.convert(mode) return self.image.resize((width, height), Image.ANTIALIAS) def scale(self, width: int, height: int, output_type: str) -> BytesIO: |