Cómo aplicar una transformación afín a un solo punto en PIL?
En PIL he rotado un rectángulo en un ángulo y lo he pegado de nuevo en la imagen de fondo.
Me gustaría saber cuáles serán las nuevas coordenadas de una esquina específica.
función (coordenadas_antiguas) => coordenadas nuevas
He leído en la documentación que menciona que el centro de rotación por defecto es el centro de la imagen.
Aquí está mi código:
import PIL
from PIL import Image, ImageDraw
import os
background = Image.open('background.jpg')
rectangle = Image.open("rectangle.png")
my_angle = 30
rectangle_rotate = Image.Image.rotate(rectangle, angle=my_angle, resample=Image.BICUBIC, expand=True)
# box: 2-tuple que da la esquina superior izquierda
px = int(background.size[0] / 2)
py = int(background.size[1] / 2)
background.paste(im=rectangle_rotate,
box=(px, py),
mask=rectangle_rotate)
# ¡La nueva posición que estoy obteniendo es incorrecta, ¿cómo puede ser?????
pos_xNuevo = px * math.cos(math.radians(my_angle)) + py * math.sin(math.radians(my_angle))
pos_yNuevo = -px * math.sin(math.radians(my_angle)) + py * math.cos(math.radians(my_angle))
print('pos_xNuevo:', pos_xNuevo)
print('pos_yNuevo:', pos_yNuevo)
draw_img_pts = ImageDraw.Draw(background)
r = 10
# Dibujando un círculo pequeño simple para visualización
draw_img_pts.ellipse((pos_xNuevo - r, pos_yNuevo - r, pos_xNuevo + r, pos_yNuevo + r), fill='red')
background.save('ejemplo_con_rotacion.png')
¿Cómo puedo encontrar el valor de las nuevas coordenadas? Sigo obteniendo un valor incorrecto.
Imagen de fondo (entrada):
Imagen del rectángulo (entrada):
La salida que obtuve sin rotación de cero, como se esperaba:
Salida que obtuve después de una rotación de 30 grados:
davy.ai
Para encontrar las nuevas coordenadas de una esquina específica después de rotar un rectángulo en un ángulo y pegarlo de nuevo en la imagen de fondo en PIL, puedes utilizar la función
affine_transform
del móduloPIL.Image
.Suponiendo que deseas encontrar las nuevas coordenadas de la esquina superior izquierda del rectángulo, primero puedes calcular las coordenadas de las cuatro esquinas del rectángulo original con respecto a su esquina superior izquierda, utilizando el método
getbbox
del objeto de imagen del rectángulo:Luego, puedes aplicar la misma rotación a estas coordenadas relativas de las esquinas utilizando la función
affine_transform
:Finalmente, puedes agregar las coordenadas de la esquina superior izquierda del rectángulo rotado a estas coordenadas relativas para obtener su posición absoluta en la imagen de fondo:
Las variables
new_x1
ynew_y1
contendrán las nuevas coordenadas de la esquina superior izquierda del rectángulo rotado en la imagen de fondo.