2011-03-09 5 views
13

Estoy tratando de rotar una imagen en Python usando PIL y teniendo el argumento expandir en verdadero. Parece que cuando el fondo de mi imagen es negro, la imagen resultante guardada como un bmp será mucho más pequeña que si tengo un fondo blanco para mi imagen, y luego reemplazo el negro debido a que se expande con blanco. En cualquier caso, mi imagen original siempre tiene dos colores, y ahora necesito que el tamaño del archivo sea pequeño, ya que estoy colocando estas imágenes en un dispositivo incrustado.Especifique el color de relleno de la imagen al rotar en python con PIL y establezca el argumento expandir en verdadero

¿Alguna idea si puedo forzar la rotación para rellenar otro color al expandir o si hay otra manera de rotar mi imagen para hacerlo pequeña?

Respuesta

22

Si su imagen original no tiene una capa alfa, puede usar una capa alfa como máscara para convertir el fondo en 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') 
0

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

Las dos imágenes tienen fondo de color y canal alfa diferente de cero para mostrar lo que está sucediendo. 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() 
Cuestiones relacionadas