Especifique el color de relleno de la imagen cuando gire en python con PIL y configure expand argumento a verdadero

Estoy tratando de rotar una imagen en Python usando PIL y tener el argumento expandido a verdadero. Parece que cuando el fondo de mi imagen es negro, la imagen resultante guardada como bmp será mucho más pequeña que si tuviera un fondo blanco para mi imagen, y luego reemplacé el negro debido a que se expandió con blanco. En cualquier caso, mi imagen original es siempre de dos colores, y en este momento necesito que el tamaño del archivo sea pequeño, ya que estoy colocando estas imágenes en un dispositivo integrado.

¿Alguna idea sobre si puedo forzar la rotación para rellenar otro color al expandir o si hay otra forma de rotar mi foto para hacerla pequeña?

Si su imagen original no tiene capa alfa, puede usar una capa alfa como máscara para convertir el fondo a blanco. Cuando rotate crea el “fondo”, lo hace completamente transparente.

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

Aquí hay una versión de trabajo, inspirada en la respuesta, pero funciona sin abrir o guardar imágenes y muestra cómo rotar un texto.

Las dos imágenes tienen un fondo de color y un canal alfa diferente de cero para mostrar lo que está pasando. Cambiar los dos canales alfa de 92 a 0 los hará completamente transparentes.

 from PIL import Image, ImageFont, ImageDraw text = '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, 10 sx, sy = image2.size image1.paste(image2, (px, py, px + sx, py + sy), image2) image1.show()