Per vedere che non si tratta solo di spostare i punti, basta disegnare una cornice attorno all'immagine: nella versione ruotata, l'immagine avrà i bordi diagonali e quindi non si adatta nemmeno alle dimensioni del immagine originale.
Quindi, per ruotarlo dovrai calcolare dove ogni pixel va. Nota che il punto in alto a sinistra (0,1)
non finirà a (1,1)
ma in un punto della diagonale la cui distanza dall'origine è 1
: vale a dire, a (sqrt(2)/2, sqrt(2)/2)
. Poiché sin(45) = cos(45) = sqrt(2)/2
, l'algoritmo che stai cercando è la moltiplicazione delle coordinate di ogni punto per questa matrice di trasformazione:
| sqrt(2)/2 sqrt(2)/2 |
| -sqrt(2)/2 sqrt(2)/2 |
Guarda la pagina di Wikipedia su Matrici di trasformazione per i dettagli. Quindi, devi fare molte moltiplicazioni ma non devi calcolare qualsiasi seni o coseni (l'ho appena fatto per te dalla memoria). Puoi prendere altre scorciatoie, come suggerito dalle altre risposte, ma in un modo o nell'altro devi calcolare dove ogni pixel deve andare.
Ovviamente dovrai anche ritagliare o eseguire il pad per creare una normale immagine rettangolare.
PS. Meglio ancora, invece di implementare questa soluzione, affidarla a una libreria grafica che fa rotazioni. Oppure consulta questa domanda SO e la soluzione suggerita nei commenti sotto la domanda:
Consider scipy.ndimage.interpolation.shift() and rotate() or skimage.transform.fast_homography() for interpolated translations and rotations of 2D numpy arrays.