17
17
18
18
import sys
19
19
20
+ try :
21
+ from bitmaptools import readinto as _bitmap_readinto
22
+ except ImportError :
23
+ _bitmap_readinto = None # pylint: disable=invalid-name
24
+
20
25
21
26
def load (
22
27
file ,
@@ -57,7 +62,7 @@ def load(
57
62
minimum_color_depth *= 2
58
63
59
64
if sys .maxsize > 1073741823 :
60
- # pylint: disable=import-outside-toplevel
65
+ # pylint: disable=import-outside-toplevel, relative-beyond-top-level
61
66
from .negative_height_check import negative_height_check
62
67
63
68
# convert unsigned int to signed int when height is negative
@@ -81,18 +86,29 @@ def load(
81
86
range3 = 1
82
87
83
88
if compression == 0 :
84
- chunk = bytearray (line_size )
85
- for y in range (range1 , range2 , range3 ):
86
- file .readinto (chunk )
87
- pixels_per_byte = 8 // color_depth
88
- offset = y * width
89
-
90
- for x in range (width ):
91
- i = x // pixels_per_byte
92
- pixel = (
93
- chunk [i ] >> (8 - color_depth * (x % pixels_per_byte + 1 ))
94
- ) & mask
95
- bitmap [offset + x ] = pixel
89
+
90
+ if _bitmap_readinto :
91
+ _bitmap_readinto (
92
+ bitmap ,
93
+ file ,
94
+ bits_per_pixel = color_depth ,
95
+ element_size = 4 ,
96
+ reverse_pixels_in_element = False ,
97
+ reverse_rows = True ,
98
+ )
99
+ else : # use the standard file.readinto
100
+ chunk = bytearray (line_size )
101
+ for y in range (range1 , range2 , range3 ):
102
+ file .readinto (chunk )
103
+ pixels_per_byte = 8 // color_depth
104
+ offset = y * width
105
+
106
+ for x in range (width ):
107
+ i = x // pixels_per_byte
108
+ pixel = (
109
+ chunk [i ] >> (8 - color_depth * (x % pixels_per_byte + 1 ))
110
+ ) & mask
111
+ bitmap [offset + x ] = pixel
96
112
elif compression in (1 , 2 ):
97
113
decode_rle (
98
114
bitmap = bitmap ,
0 commit comments