Uso de PIL para girar automáticamente la imagen tomada con el teléfono celular y el acelerómetro

Estoy usando Django + PIL + Amazon boto en una aplicación web. El usuario envía la imagen y la aplicación web la muestra. En su mayoría, la gente envía una foto tomada desde su teléfono celular. A veces, la imagen se muestra en la orientación incorrecta. ¿Hay alguna forma de usar PIL o ImageField de Django para obtener la metainformación de la imagen y usarla para rotar la imagen a la orientación correcta?

Intenta esto para obtener la información EXIF. NB: el método _getexif() pertenece al complemento JPEG. No existirá en otros tipos de imágenes.

 import Image from PIL.ExifTags import TAGS im = Image.open('a-jpeg-file.jpg') exifdict = im._getexif() if len(exifdict): for k in exifdict.keys(): if k in TAGS.keys(): print TAGS[k], exifdict[k] else: print k, exifdict[k] 

Para una imagen aleatoria que encontré en mi disco duro, esto produjo:

 ExifVersion 0221 ComponentsConfiguration ApertureValue (4312, 1707) DateTimeOriginal 2012:07:19 17:33:37 DateTimeDigitized 2012:07:19 17:33:37 41989 35 FlashPixVersion 0100 MeteringMode 5 Flash 32 FocalLength (107, 25) 41986 0 Make Apple Model iPad Orientation 1 YCbCrPositioning 1 SubjectLocation (1295, 967, 699, 696) SensingMethod 2 XResolution (72, 1) YResolution (72, 1) ExposureTime (1, 60) ExposureProgram 2 ColorSpace 1 41990 0 ISOSpeedRatings 80 ResolutionUnit 2 41987 0 FNumber (12, 5) Software 5.1.1 DateTime 2012:07:19 17:33:37 41994 0 ExifImageWidth 2592 ExifImageHeight 1936 ExifOffset 188 

Es el valor de Orientation que desea. Su significado se puede encontrar, por ejemplo, en la página de orientación exif .

Los datos brutos de exif están disponibles como una cadena desde Image.info['exif'] . La rotación se puede lograr con el método rotate() .

No tengo conocimiento de un método para cambiar los datos EXIF ​​usando PIL, aparte de cambiar los datos sin procesar.

Estoy usando django-imagekit para procesar imágenes y luego usar imagekit.processors.Transpose

 from imagekit.models import ImageSpecField from imagekit.processors import ResizeToFill, Transpose, SmartResize class UserProfile(models.Model): avatar = models.ImageField(upload_to='upload/avatars', max_length=255, blank=True, null=True) avatar_thumbnail = ImageSpecField( source='avatar', processors = [Transpose(),SmartResize(200, 200)], format = 'JPEG', options = {'quality': 75} )