1717
1818import sys
1919
20+ try :
21+ from bitmaptools import readinto as _bitmap_readinto
22+ except ImportError :
23+ _bitmap_readinto = None # pylint: disable=invalid-name
24+
2025
2126def load (
2227 file ,
@@ -57,7 +62,7 @@ def load(
5762 minimum_color_depth *= 2
5863
5964 if sys .maxsize > 1073741823 :
60- # pylint: disable=import-outside-toplevel
65+ # pylint: disable=import-outside-toplevel, relative-beyond-top-level
6166 from .negative_height_check import negative_height_check
6267
6368 # convert unsigned int to signed int when height is negative
@@ -81,18 +86,29 @@ def load(
8186 range3 = 1
8287
8388 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
96112 elif compression in (1 , 2 ):
97113 decode_rle (
98114 bitmap = bitmap ,
0 commit comments