@@ -1186,23 +1186,21 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
1186
1186
# attempt to minimize storage requirements for palette images
1187
1187
if "bits" in im .encoderinfo :
1188
1188
# number of bits specified by user
1189
- colors = 1 << im .encoderinfo ["bits" ]
1189
+ colors = min ( 1 << im .encoderinfo ["bits" ], 256 )
1190
1190
else :
1191
1191
# check palette contents
1192
1192
if im .palette :
1193
- colors = max (min (len (im .palette .getdata ()[1 ]) // 3 , 256 ), 2 )
1193
+ colors = max (min (len (im .palette .getdata ()[1 ]) // 3 , 256 ), 1 )
1194
1194
else :
1195
1195
colors = 256
1196
1196
1197
- if colors <= 2 :
1198
- bits = 1
1199
- elif colors <= 4 :
1200
- bits = 2
1201
- elif colors <= 16 :
1202
- bits = 4
1203
- else :
1204
- bits = 8
1205
- if bits != 8 :
1197
+ if colors <= 16 :
1198
+ if colors <= 2 :
1199
+ bits = 1
1200
+ elif colors <= 4 :
1201
+ bits = 2
1202
+ else :
1203
+ bits = 4
1206
1204
mode = f"{ mode } ;{ bits } "
1207
1205
1208
1206
# encoder options
@@ -1270,7 +1268,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
1270
1268
chunk (fp , cid , data )
1271
1269
1272
1270
if im .mode == "P" :
1273
- palette_byte_number = ( 2 ** bits ) * 3
1271
+ palette_byte_number = colors * 3
1274
1272
palette_bytes = im .im .getpalette ("RGB" )[:palette_byte_number ]
1275
1273
while len (palette_bytes ) < palette_byte_number :
1276
1274
palette_bytes += b"\0 "
@@ -1281,7 +1279,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
1281
1279
if transparency or transparency == 0 :
1282
1280
if im .mode == "P" :
1283
1281
# limit to actual palette size
1284
- alpha_bytes = 2 ** bits
1282
+ alpha_bytes = colors
1285
1283
if isinstance (transparency , bytes ):
1286
1284
chunk (fp , b"tRNS" , transparency [:alpha_bytes ])
1287
1285
else :
@@ -1302,7 +1300,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
1302
1300
else :
1303
1301
if im .mode == "P" and im .im .getpalettemode () == "RGBA" :
1304
1302
alpha = im .im .getpalette ("RGBA" , "A" )
1305
- alpha_bytes = 2 ** bits
1303
+ alpha_bytes = colors
1306
1304
chunk (fp , b"tRNS" , alpha [:alpha_bytes ])
1307
1305
1308
1306
dpi = im .encoderinfo .get ("dpi" )
0 commit comments