@@ -107,17 +107,23 @@ def _parse_headers(
107107
108108 number_of_bits = int (headers [prefix + b"BITPIX" ])
109109 if number_of_bits == 8 :
110- self ._mode = "L"
110+ self ._mode = rawmode = "L"
111111 elif number_of_bits == 16 :
112112 self ._mode = "I;16"
113+ rawmode = "I;16B"
113114 elif number_of_bits == 32 :
114115 self ._mode = "I"
115- elif number_of_bits in (- 32 , - 64 ):
116+ rawmode = "I;32B"
117+ elif number_of_bits == - 32 or (decoder_name == "raw" and number_of_bits == - 64 ):
116118 self ._mode = "F"
119+ rawmode = f"F;{ number_of_bits * - 1 } BF"
120+ else :
121+ msg = "Unsupported number of bits"
122+ raise OSError (msg )
117123
118124 args : tuple [str | int , ...]
119125 if decoder_name == "raw" :
120- args = (self . mode , 0 , - 1 )
126+ args = (rawmode , 0 , - 1 )
121127 else :
122128 args = (number_of_bits ,)
123129 return decoder_name , offset , args
@@ -133,11 +139,13 @@ def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int
133139
134140 rows = []
135141 offset = 0
136- number_of_bits = min (self .args [0 ] // 8 , 4 )
142+ number_of_bytes = abs (self .args [0 ]) // 8
137143 for y in range (self .state .ysize ):
138144 row = bytearray ()
139145 for x in range (self .state .xsize ):
140- row += value [offset + (4 - number_of_bits ) : offset + 4 ]
146+ row += value [
147+ offset + 4 - 1 : offset + (4 - number_of_bytes ) - 1 : - 1
148+ ]
141149 offset += 4
142150 rows .append (row )
143151 self .set_as_raw (bytes ([pixel for row in rows [::- 1 ] for pixel in row ]))
0 commit comments