Skip to content

Commit b7d0908

Browse files
committed
Increase use of bytearrays to improve loading speed
1 parent badc920 commit b7d0908

1 file changed

Lines changed: 20 additions & 16 deletions

File tree

src/PIL/QoiImagePlugin.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
from . import Image, ImageFile
1313
from ._binary import i32be as i32
14-
from ._binary import o8
1514

1615

1716
def _accept(prefix):
@@ -49,50 +48,55 @@ def _add_to_previous_pixels(self, value):
4948
def decode(self, buffer):
5049
self._previously_seen_pixels = {}
5150
self._previous_pixel = None
52-
self._add_to_previous_pixels(b"".join(o8(i) for i in (0, 0, 0, 255)))
51+
self._add_to_previous_pixels(bytearray((0, 0, 0, 255)))
5352

5453
data = bytearray()
5554
bands = Image.getmodebands(self.mode)
5655
dest_length = self.state.xsize * self.state.ysize * bands
5756
while len(data) < dest_length:
5857
byte = self.fd.read(1)[0]
5958
if byte == 0b11111110: # QOI_OP_RGB
60-
value = self.fd.read(3) + self._previous_pixel[3:]
59+
value = bytearray(self.fd.read(3)) + self._previous_pixel[3:]
6160
elif byte == 0b11111111: # QOI_OP_RGBA
6261
value = self.fd.read(4)
6362
else:
6463
op = byte >> 6
6564
if op == 0: # QOI_OP_INDEX
6665
op_index = byte & 0b00111111
67-
value = self._previously_seen_pixels.get(op_index, (0, 0, 0, 0))
66+
value = self._previously_seen_pixels.get(
67+
op_index, bytearray((0, 0, 0, 0))
68+
)
6869
elif op == 1: # QOI_OP_DIFF
69-
value = (
70-
(self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2)
71-
% 256,
72-
(self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2)
73-
% 256,
74-
(self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256,
70+
value = bytearray(
71+
(
72+
(self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2)
73+
% 256,
74+
(self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2)
75+
% 256,
76+
(self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256,
77+
self._previous_pixel[3],
78+
)
7579
)
76-
value += (self._previous_pixel[3],)
7780
elif op == 2: # QOI_OP_LUMA
7881
second_byte = self.fd.read(1)[0]
7982
diff_green = (byte & 0b00111111) - 32
8083
diff_red = ((second_byte & 0b11110000) >> 4) - 8
8184
diff_blue = (second_byte & 0b00001111) - 8
8285

83-
value = tuple(
84-
(self._previous_pixel[i] + diff_green + diff) % 256
85-
for i, diff in enumerate((diff_red, 0, diff_blue))
86+
value = bytearray(
87+
tuple(
88+
(self._previous_pixel[i] + diff_green + diff) % 256
89+
for i, diff in enumerate((diff_red, 0, diff_blue))
90+
)
8691
)
87-
value += (self._previous_pixel[3],)
92+
value += self._previous_pixel[3:]
8893
elif op == 3: # QOI_OP_RUN
8994
run_length = (byte & 0b00111111) + 1
9095
value = self._previous_pixel
9196
if bands == 3:
9297
value = value[:3]
9398
data += value * run_length
9499
continue
95-
value = b"".join(o8(i) for i in value)
96100
self._add_to_previous_pixels(value)
97101

98102
if bands == 3:

0 commit comments

Comments
 (0)