2015-07-08 10 views
6

Ich verwende PIL, um ein Bild zu drehen. Dies funktioniert im Allgemeinen, außer wenn ich das Bild genau um 90 ° oder 270 ° rotiere. In diesem Fall tauschen die x- und y-Messungen aus. Das heißt, das Bild gegeben:Wie kann ich verhindern, dass PIL beim Drehen eines Bildes um 90 ° Höhe/Breite wechselt?

>>> img.size 
(93, 64) 

Wenn ich es drehen um 89 ° ich dieses:

>>> img.rotate(89).size 
(93, 64) 

Und um 91 ° Ich bekomme diese:

>>> img.rotate(91).size 
(93, 64) 

Aber wenn ich drehen sie entweder 90 ° oder 270 °, finde ich die Höhe und Breite vertauscht:

>>> img.rotate(90).size 
(64, 93) 
>>> img.rotate(270).size 
(64, 93) 

Was ist der richtige Weg, dies zu verhindern?

+1

Es sieht aus wie 90 und 270 sind Sonderfälle und tun, was * die meisten * Leute erwarten. Sie können Pech haben, obwohl Sie die Option 'expand' verwenden können, um sie konsistent zu machen. –

+0

Ich glaube nicht, dass "expand" von selbst funktioniert; Ich schreibe auf einen Bildschirm fester Größe. Möglicherweise "erweitern" und eine Art "Crop" -Operation. – larsks

+1

Update für andere Googler: Pillow, die ausgezeichnete PIL-Gabel, behebt dieses Problem in 3.0.0. Bei einer Drehung von 90 oder 270 Grad wird jetzt dieselbe Dimension beibehalten. Daher müssen Sie expand = True festlegen, wenn Sie möchten, dass sich die Dimensionen tatsächlich ändern. – Agargara

Antwort

5

Ich bin der Hoffnung, jemand kommt mit einer anmutiger Lösung, aber dies scheint jetzt zu funktionieren:

img = Image.open('myimage.pbm') 

frames = [] 
for angle in range(0, 365, 5): 
    # rotate the image with expand=True, which makes the canvas 
    # large enough to contain the entire rotated image. 
    x = img.rotate(angle, expand=True) 

    # crop the rotated image to the size of the original image 
    x = x.crop(box=(x.size[0]/2 - img.size[0]/2, 
       x.size[1]/2 - img.size[1]/2, 
       x.size[0]/2 + img.size[0]/2, 
       x.size[1]/2 + img.size[1]/2)) 

    # do stuff with the rotated image here. 

Für andere Winkel als 90 ° und 270 ° ergibt sich das gleiche Verhalten wie Sie erhalten, wenn Sie expand=False einstellen und sich nicht mit dem crop Betrieb beschäftigen.

+1

Beachten Sie, dass die Option "Erweitern" auch eine der Dimensionen reduziert, sodass das Zuschneiden nicht ausreicht - Sie müssen auch einen Hintergrund hinzufügen. –

+0

Ich sehe dieses Problem nicht mit 'expand'. Zumindest für das, was ich versuche, scheint das ein Vergnügen zu sein. Sie können das Ergebnis [hier] sehen (https://youtu.be/Fp6-uDrtd9E). Es hat eine niedrige Auflösung, da dies letztendlich auf einem 128x64 LCD angezeigt wird. – larsks

Verwandte Themen