在推送到S3之前,是否有更清洁的方法来旋转通过烧瓶上传的智能手机图像?

Tsumnia

我正在构建一个Webapp,该Webapp接收上传的图像,将其存储在Amazon S3上,然后将URL存储在SQLite数据库中。不幸的是,EXIF标签会导致通过智能手机拍摄的图像看上去旋转(因为它们是带有EXIF方向标签的横向图像)。

当前,我的环境从POST数据中获取文件,将其保存到我的静态文件文件夹中,使用PIL旋转图像(如果需要),推送到S3,最后删除本地副本。以下是其中的一些代码:

from PIL import Image
import boto
from boto.s3.connection import S3Connection
from boto.s3.key import Key

def fix_orientation(filename):
    img = Image.open(filename)
    if hasattr(img, '_getexif'):
        exifdata = img._getexif()
        try:
            orientation = exifdata.get(274)
        except:
            # There was no EXIF Orientation Data
            orientation = 1
    else:
        orientation = 1

    if orientation is 1:    # Horizontal (normal)
        pass
    elif orientation is 2:  # Mirrored horizontal
        img = img.transpose(Image.FLIP_LEFT_RIGHT)
    elif orientation is 3:  # Rotated 180
        img = img.rotate(180)
    elif orientation is 4:  # Mirrored vertical
        img = img.rotate(180).transpose(Image.FLIP_LEFT_RIGHT)
    elif orientation is 5:  # Mirrored horizontal then rotated 90 CCW
        img = img.rotate(-90).transpose(Image.FLIP_LEFT_RIGHT)
    elif orientation is 6:  # Rotated 90 CCW
        img = img.rotate(-90)
    elif orientation is 7:  # Mirrored horizontal then rotated 90 CW
        img = img.rotate(90).transpose(Image.FLIP_LEFT_RIGHT)
    elif orientation is 8:  # Rotated 90 CW
        img = img.rotate(90)

    #save the result and overwrite the originally uploaded image
    img.save(filename)

def push_to_s3(**kwargs):
    try:
        conn = S3Connection(app.config["S3_KEY"], app.config["S3_SECRET"])
        buckets = [bucket.name for bucket in conn.get_all_buckets()]
        bucket = conn.get_bucket(app.config["S3_BUCKET"])

        k = Key(bucket)
        k.key = app.config["S3_UPLOAD_DIR"] + kwargs.get("filename")
        k.set_contents_from_filename(kwargs.get("photo"))
        k.make_public()
        return k
except Exception, e:
    abort(500)

这是处理POST数据

# Retrieving Form POST Data
fi = request.files.get("file")

#print "Storing and Rotating File (if needed)"
f = photos.save(fi)
path = photos.path(f)
fix_orientation(path)

#print "Uploading to S3"
img = push_to_s3(photo=path, filename=filename)

#print "Deleting Local Version"
os.remove(path)

上面的解决方案可以在Heroku的服务器上运行,但似乎只是解决方案的完美结合。有没有更清洁的方式来做我正在做的事情。也就是说,拿一个上传的文件,从内存中旋转它,然后推送到S3?

我还使用Flask-Uploads处理上传图像的存储。

肖恩·维埃拉(Sean Vieira)

对于什么是值得的,枕头支持许多其他输入不是文件名-其中包括bytearraybuffer,和file-like object第三个很可能是您要寻找的东西,因为从其中装载的任何东西request.files都只是一个FileStorage类似文件的对象。这将加载和转换代码简化为:

def fix_orientation(file_like_object):
    img = Image.open(filename)

    # ... snip ...

    data = BytesIO()
    img.save(data)
    return data

由于我们将无需使用文件系统就可以非常方便地传递数据,因此我们也可以改用boto.s3.key.Keyset_contents_from_file方法代替set_contents_from_filename

def push_to_s3(photo, filename):
    # ... snip ...
    k.set_contents_from_file(photo, rewind=True)
    # ... etc. ...

这样可以简化实现:

# Retrieving Form POST Data
fi = request.files.get("file")

# print "Rotating File (if needed)"
fi = fix_orientation(fi)

# print "Uploading to S3"
push_to_s3(photo=fi, filename=filename)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在推送到S3之前,是否有更清洁的方法来旋转通过烧瓶上传的智能手机图像?

来自分类Dev

如何在Unity3D中检查智能手机是否有陀螺仪?

来自分类Dev

如何通过Ubuntu扎根Lenovo k3 Note智能手机

来自分类Dev

有什么方法可以防止虚拟智能手机键盘隐藏输入?

来自分类Dev

是否有可以与智能手机TRRS耳机接口的台式机3.5毫米插孔?

来自分类Dev

将数据从Android Watch发送到智能手机

来自分类Dev

3G加密狗是否比内置智能手机3G芯片快?

来自分类Dev

电脑和智能手机/平板电脑上的图像颜色不同

来自分类Dev

检测平板电脑和智能手机

来自分类Dev

OOP设计与智能手机的性能

来自分类Dev

使用libGDX访问智能手机的相机

来自分类Dev

获取智能手机的标识符

来自分类Dev

如何使我的网站响应智能手机

来自分类Dev

如何安装智能手机以恢复文件

来自分类Dev

大屏幕智能手机的RWD失败

来自分类Dev

与iPhone /智能手机共享RAM?

来自分类Dev

从智能手机下载照片

来自分类Dev

仅为智能手机加载不同的JavaScript

来自分类Dev

压缩来自智能手机的视频

来自分类Dev

ExtJS 4 智能手机尺寸

来自分类Dev

CSS 媒体智能手机

来自分类Dev

通过PC或其他智能手机远程启动和停止Android应用

来自分类Dev

通过PushOver的Javascript(用户脚本)智能手机通知

来自分类Dev

通过PC或其他智能手机远程启动和停止Android应用

来自分类Dev

如何通过JavaScript / CSS检测智能手机?

来自分类Dev

如何使用USB电缆通过android智能手机访问dslr

来自分类Dev

无线设备(例如智能手机)是否会发送AP等信标等效帧?

来自分类Dev

是否可以从浏览器访问智能手机的蓝牙?

来自分类Dev

为什么Firefox / Chrome响应式仿真与智能手机之间有区别?

Related 相关文章

  1. 1

    在推送到S3之前,是否有更清洁的方法来旋转通过烧瓶上传的智能手机图像?

  2. 2

    如何在Unity3D中检查智能手机是否有陀螺仪?

  3. 3

    如何通过Ubuntu扎根Lenovo k3 Note智能手机

  4. 4

    有什么方法可以防止虚拟智能手机键盘隐藏输入?

  5. 5

    是否有可以与智能手机TRRS耳机接口的台式机3.5毫米插孔?

  6. 6

    将数据从Android Watch发送到智能手机

  7. 7

    3G加密狗是否比内置智能手机3G芯片快?

  8. 8

    电脑和智能手机/平板电脑上的图像颜色不同

  9. 9

    检测平板电脑和智能手机

  10. 10

    OOP设计与智能手机的性能

  11. 11

    使用libGDX访问智能手机的相机

  12. 12

    获取智能手机的标识符

  13. 13

    如何使我的网站响应智能手机

  14. 14

    如何安装智能手机以恢复文件

  15. 15

    大屏幕智能手机的RWD失败

  16. 16

    与iPhone /智能手机共享RAM?

  17. 17

    从智能手机下载照片

  18. 18

    仅为智能手机加载不同的JavaScript

  19. 19

    压缩来自智能手机的视频

  20. 20

    ExtJS 4 智能手机尺寸

  21. 21

    CSS 媒体智能手机

  22. 22

    通过PC或其他智能手机远程启动和停止Android应用

  23. 23

    通过PushOver的Javascript(用户脚本)智能手机通知

  24. 24

    通过PC或其他智能手机远程启动和停止Android应用

  25. 25

    如何通过JavaScript / CSS检测智能手机?

  26. 26

    如何使用USB电缆通过android智能手机访问dslr

  27. 27

    无线设备(例如智能手机)是否会发送AP等信标等效帧?

  28. 28

    是否可以从浏览器访问智能手机的蓝牙?

  29. 29

    为什么Firefox / Chrome响应式仿真与智能手机之间有区别?

热门标签

归档