@@ -44,7 +44,9 @@ def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]:
4444 return left , top , right , bottom
4545
4646
47- def _color (color : str | int | tuple [int , ...], mode : str ) -> int | tuple [int , ...]:
47+ def _color (
48+ color : str | int | tuple [int , ...] | None , mode : str
49+ ) -> int | tuple [int , ...] | None :
4850 if isinstance (color , str ):
4951 from . import ImageColor
5052
@@ -331,6 +333,23 @@ def cover(
331333 return image .resize (size , resample = method )
332334
333335
336+ def _new_with_fill (
337+ image : Image .Image , size : tuple [int , int ], fill : str | int | tuple [int , ...] | None
338+ ) -> Image .Image :
339+ color = _color (fill , image .mode )
340+ if image .palette :
341+ mode = image .palette .mode
342+ palette = ImagePalette .ImagePalette (mode , image .getpalette (mode ))
343+ if isinstance (color , tuple ) and len (color ) in (3 , 4 ):
344+ color = palette .getcolor (color )
345+ else :
346+ palette = None
347+ out = Image .new (image .mode , size , color )
348+ if palette :
349+ out .putpalette (palette .palette , mode )
350+ return out
351+
352+
334353def pad (
335354 image : Image .Image ,
336355 size : tuple [int , int ],
@@ -363,11 +382,7 @@ def pad(
363382 if resized .size == size :
364383 out = resized
365384 else :
366- out = Image .new (image .mode , size , color )
367- if resized .palette :
368- palette = resized .getpalette ()
369- if palette is not None :
370- out .putpalette (palette )
385+ out = _new_with_fill (resized , size , color )
371386 if resized .width != size [0 ]:
372387 x = round ((size [0 ] - resized .width ) * max (0 , min (centering [0 ], 1 )))
373388 out .paste (resized , (x , 0 ))
@@ -500,17 +515,7 @@ def expand(
500515 left , top , right , bottom = _border (border )
501516 width = left + image .size [0 ] + right
502517 height = top + image .size [1 ] + bottom
503- color = _color (fill , image .mode )
504- if image .palette :
505- mode = image .palette .mode
506- palette = ImagePalette .ImagePalette (mode , image .getpalette (mode ))
507- if isinstance (color , tuple ) and (len (color ) == 3 or len (color ) == 4 ):
508- color = palette .getcolor (color )
509- else :
510- palette = None
511- out = Image .new (image .mode , (width , height ), color )
512- if palette :
513- out .putpalette (palette .palette , mode )
518+ out = _new_with_fill (image , (width , height ), fill )
514519 out .paste (image , (left , top ))
515520 return out
516521
0 commit comments