| 185 | yield thumb_path, thumb_image, thumb_buf |
| 186 | |
| 187 | def convert_image( |
| 188 | self, |
| 189 | image: Image.Image, |
| 190 | size: tuple[int, int] | None = None, |
| 191 | *, |
| 192 | response_body: BytesIO, |
| 193 | ) -> tuple[Image.Image, BytesIO]: |
| 194 | if image.format in {"PNG", "WEBP"} and image.mode == "RGBA": |
| 195 | background = self._Image.new("RGBA", image.size, (255, 255, 255)) |
| 196 | background.paste(image, image) |
| 197 | image = background.convert("RGB") |
| 198 | elif image.mode == "P": |
| 199 | image = image.convert("RGBA") |
| 200 | background = self._Image.new("RGBA", image.size, (255, 255, 255)) |
| 201 | background.paste(image, image) |
| 202 | image = background.convert("RGB") |
| 203 | elif image.mode != "RGB": |
| 204 | image = image.convert("RGB") |
| 205 | |
| 206 | if size: |
| 207 | image = image.copy() |
| 208 | try: |
| 209 | # Image.Resampling.LANCZOS was added in Pillow 9.1.0 |
| 210 | # remove this try except block, |
| 211 | # when updating the minimum requirements for Pillow. |
| 212 | resampling_filter = self._Image.Resampling.LANCZOS |
| 213 | except AttributeError: |
| 214 | resampling_filter = self._Image.ANTIALIAS # type: ignore[attr-defined] |
| 215 | image.thumbnail(size, resampling_filter) |
| 216 | elif image.format == "JPEG": |
| 217 | return image, response_body |
| 218 | |
| 219 | buf = BytesIO() |
| 220 | image.save(buf, "JPEG") |
| 221 | return image, buf |
| 222 | |
| 223 | def get_media_requests( |
| 224 | self, item: Any, info: MediaPipeline.SpiderInfo |