2012-08-26 44 views
7

我在一个web应用程序中使用Django + PIL +亚马逊boto。用户发送图片并且webapp显示它。大多数人都会发送手机拍摄的照片。有时,图像显示方向错误。有没有办法使用PIL或Django的ImageField从图像中获取元信息并使用它来将图像旋转到正确的方向?使用PIL自动旋转拍摄的手机和accelorometer

+1

继承人一个线程,也许可以帮助你:HTTP://stackoverflow.com/questions/1606587/how-to-use-pil-调整大小和应用旋转exif信息的文件 – Jingo

+0

这可能会帮助你http://stackoverflow.com/questions/4228530/pil-thumbnail-is-rotating-my-image – Rakesh

回答

3

试试这个获取EXIF信息。 N.B .: _getexif()方法属于JPEG插件。它不会存在于其他类型的图像中。

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] 

因为我在我的硬盘上发现了一个随机图像,由此产生:

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 

这是你想要的Orientation值。它的含义可以在例如在exif orientation page

原始exif数据可从Image.info['exif']以字符串形式获得。 旋转可以用rotate()方法完成。

我不知道使用PIL更改EXIF数据的方法,而不是更改原始数据。

3

我使用django-imagekit用于处理图像,然后使用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} 
) 
相关问题