2012-08-26 11 views
7

Używam Django + PIL + Amazon boto w aplikacji internetowej. Użytkownik przesyła obraz, a aplikacja wyświetla go. Przeważnie ludzie wysyłają zdjęcia zrobione z ich telefonu komórkowego. Czasami obraz jest wyświetlany w niewłaściwej orientacji. Czy istnieje sposób użycia PIL lub Django ImageField, aby uzyskać meta informacje z obrazu i użyć go do obracania obrazu do prawidłowej orientacji?Używanie trybu PIL do automatycznego obracania zdjęcia zrobionego za pomocą telefonu komórkowego i accelorometru

+1

Herezje wątek, który może może pomóc: http: //stackoverflow.com/questions/1606587/how-to-use-pil- aby zmienić rozmiar i zastosować-obrót-exif-informacje-do-pliku – Jingo

+0

To może ci pomóc http://stackoverflow.com/questions/4228530/pil-thumbnail-is-rotating-my-image – Rakesh

Odpowiedz

3

Spróbuj uzyskać informacje EXIF. N.B .: metoda _getexif() należy do wtyczki JPEG. Nie będzie istnieć w innych typach obrazów.

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] 

random obrazek znalazłem na moim twardym dysku, to produkowane:

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 

Jest to wartość Orientation, że chcesz. Jego znaczenie można znaleźć np. na exif orientation page.

Surowe dane exif są dostępne jako ciąg od Image.info['exif']. Obrót można wykonać za pomocą metody rotate().

Nie jestem świadomy metody zmiany danych EXIF ​​przy użyciu PIL, poza zmianą danych pierwotnych.

3

Używam django-imagekit do przetwarzania obrazów następnie używając 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} 
)