From 2e8e86cba1a421ab150ed259d413ae5eea238d3a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 11 Jun 2025 19:29:04 +1000 Subject: [PATCH] Only calculate LUMA deltas when necessary --- src/PIL/QoiImagePlugin.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/PIL/QoiImagePlugin.py b/src/PIL/QoiImagePlugin.py index 95c3d03c0..1d6412a45 100644 --- a/src/PIL/QoiImagePlugin.py +++ b/src/PIL/QoiImagePlugin.py @@ -182,12 +182,10 @@ class QoiEncoder(ImageFile.PyEncoder): self._previously_seen_pixels[hash_value] = pixel pr, pg, pb, pa = self._previous_pixel - if a == pa: + if pa == a: dr = self._delta(r, pr) dg = self._delta(g, pg) db = self._delta(b, pb) - dgr = self._delta(dr, dg) - dgb = self._delta(db, dg) if -2 <= dr < 2 and -2 <= dg < 2 and -2 <= db < 2: data += o8( @@ -196,12 +194,15 @@ class QoiEncoder(ImageFile.PyEncoder): | (dg + 2) << 2 | (db + 2) ) # QOI_OP_DIFF - elif -8 <= dgr < 8 and -32 <= dg < 32 and -8 <= dgb < 8: - data += o8(0b10000000 | (dg + 32)) # QOI_OP_LUMA - data += o8((dgr + 8) << 4 | (dgb + 8)) else: - data += o8(0b11111110) # QOI_OP_RGB - data += bytes(pixel[:3]) + dgr = self._delta(dr, dg) + dgb = self._delta(db, dg) + if -8 <= dgr < 8 and -32 <= dg < 32 and -8 <= dgb < 8: + data += o8(0b10000000 | (dg + 32)) # QOI_OP_LUMA + data += o8((dgr + 8) << 4 | (dgb + 8)) + else: + data += o8(0b11111110) # QOI_OP_RGB + data += bytes(pixel[:3]) else: data += o8(0b11111111) # QOI_OP_RGBA data += bytes(pixel)