Specify image filling color when rotating in python with PIL and setting expand argument to true Specify image filling color when rotating in python with PIL and setting expand argument to true python python

Specify image filling color when rotating in python with PIL and setting expand argument to true


If your original image has no alpha layer, you can use an alpha layer as a mask to convert the background to white. When rotate creates the "background", it makes it fully transparent.

# original imageimg = Image.open('test.png')# converted to have an alpha layerim2 = img.convert('RGBA')# rotated imagerot = im2.rotate(22.2, expand=1)# a white image same size as rotated imagefff = Image.new('RGBA', rot.size, (255,)*4)# create a composite image using the alpha layer of rot as a maskout = Image.composite(rot, fff, rot)# save your work (converting back to mode='1' or whatever..)out.convert(img.mode).save('test2.bmp')


There is a parameter fillcolor in a rotate method to specify color which will be use for expanded area:

white = (255,255,255)pil_image.rotate(angle, PIL.Image.NEAREST, expand = 1, fillcolor = white)

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.rotate


Here is a working version, inspired by the answer, but it works without opening or saving images and shows how to rotate a text.

The two images have colored background and alpha channel different from zero to show what's going on. Changing the two alpha channels from 92 to 0 will make them completely transparent.

from PIL import Image, ImageFont, ImageDrawtext = 'TEST'font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 50)width, height = font.getsize(text)image1 = Image.new('RGBA', (200, 150), (0, 128, 0, 92))draw1 = ImageDraw.Draw(image1)draw1.text((0, 0), text=text, font=font, fill=(255, 128, 0))image2 = Image.new('RGBA', (width, height), (0, 0, 128, 92))draw2 = ImageDraw.Draw(image2)draw2.text((0, 0), text=text, font=font, fill=(0, 255, 128))image2 = image2.rotate(30, expand=1)px, py = 10, 10sx, sy = image2.sizeimage1.paste(image2, (px, py, px + sx, py + sy), image2)image1.show()