使用OIL自动旋转手机和加速度计拍摄的照片

时间:2012-08-26 20:23:33

标签: python django python-imaging-library django-models

我在网络应用中使用Django + PIL + Amazon boto。用户发送图片,webapp显示它。大多数情况下,人们发送从手机拍摄的照片。有时,图像显示方向错误。有没有办法使用PIL或Django的ImageField从图像中获取元信息,并使用它来将图像旋转到正确的方向?

2 个答案:

答案 0 :(得分: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数据的方法,而不是更改原始数据。

答案 1 :(得分: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}
  )