diff --git a/weasyprint/images.py b/weasyprint/images.py index 417a1c11b..67e20d8cb 100644 --- a/weasyprint/images.py +++ b/weasyprint/images.py @@ -66,7 +66,12 @@ def __init__(self, pillow_image, image_id, image_data, filename=None, self.height = pillow_image.height self.ratio = (self.width / self.height) if self.height != 0 else inf self.optimize = optimize = options['optimize_images'] - self.app14 = getattr(original_pillow_image, 'app', {}).get('APP14') + + # The presence of the APP14 segment indicates an Adobe image with + # inverted CMYK data. Specify a Decode Array to invert it again back to + # normal. See https://github.com/Kozea/WeasyPrint/pull/2179. + app14 = getattr(original_pillow_image, 'app', {}).get('APP14') + self.invert_colors = self.mode == 'CMYK' and app14 is not None if pillow_image.format in ('JPEG', 'MPO'): self.format = 'JPEG' @@ -151,11 +156,8 @@ def get_x_object(self, interpolate, dpi_ratio): }) if self.format == 'JPEG': - if self.mode == 'CMYK' and self.app14 is not None: - # The presence of the APP14 segment indicates an Adobe image - # with inverted CMYK data. Specify a Decode Array to invert - # it again back to normal. - extra['Decode'] = '[1 0 1 0 1 0 1 0]' + if self.invert_colors: + extra['Decode'] = pydyf.Array((1, 0) * 4) extra['Filter'] = '/DCTDecode' return pydyf.Stream([self.image_data], extra)