@@ -235,13 +235,19 @@ def frame(self, idx: int) -> Image.Image:
235235 alpha_bytes = self .buf .read (im .size [0 ] * im .size [1 ] * 4 )[3 ::4 ]
236236
237237 # convert to an 8bpp grayscale image
238- mask = Image .frombuffer (
239- "L" , # 8bpp
240- im .size , # (w, h)
241- alpha_bytes , # source chars
242- "raw" , # raw decoder
243- ("L" , 0 , - 1 ), # 8bpp inverted, unpadded, reversed
244- )
238+ try :
239+ mask = Image .frombuffer (
240+ "L" , # 8bpp
241+ im .size , # (w, h)
242+ alpha_bytes , # source chars
243+ "raw" , # raw decoder
244+ ("L" , 0 , - 1 ), # 8bpp inverted, unpadded, reversed
245+ )
246+ except ValueError :
247+ if ImageFile .LOAD_TRUNCATED_IMAGES :
248+ mask = None
249+ else :
250+ raise
245251 else :
246252 # get AND image from end of bitmap
247253 w = im .size [0 ]
@@ -259,19 +265,26 @@ def frame(self, idx: int) -> Image.Image:
259265 mask_data = self .buf .read (total_bytes )
260266
261267 # convert raw data to image
262- mask = Image .frombuffer (
263- "1" , # 1 bpp
264- im .size , # (w, h)
265- mask_data , # source chars
266- "raw" , # raw decoder
267- ("1;I" , int (w / 8 ), - 1 ), # 1bpp inverted, padded, reversed
268- )
268+ try :
269+ mask = Image .frombuffer (
270+ "1" , # 1 bpp
271+ im .size , # (w, h)
272+ mask_data , # source chars
273+ "raw" , # raw decoder
274+ ("1;I" , int (w / 8 ), - 1 ), # 1bpp inverted, padded, reversed
275+ )
276+ except ValueError :
277+ if ImageFile .LOAD_TRUNCATED_IMAGES :
278+ mask = None
279+ else :
280+ raise
269281
270282 # now we have two images, im is XOR image and mask is AND image
271283
272284 # apply mask image as alpha channel
273- im = im .convert ("RGBA" )
274- im .putalpha (mask )
285+ if mask :
286+ im = im .convert ("RGBA" )
287+ im .putalpha (mask )
275288
276289 return im
277290
0 commit comments