PIL对上传到Django的图片进行处理并保存的实例

 更新时间:2019年08月07日 13:48:23   作者:smartwu_sir  
今天小编就为大家分享一篇PIL对上传到Django的图片进行处理并保存的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1. 介绍

上传的图片文件:如

pic = request.FILES["picture"]
# pic是 <class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 类型的数据

# 而pillow的Image.open("./xxx.jpg") 则是:

<class 'PIL.JpegImagePlugin.JpegImageFile'> 类型的数据

# 问题是如何把InMemoryUploadedFile转化为PIL类型,并且处理之后再转回InMemoryUploadedFile,并save

2. 把InMemoryUploadedFile转化为PIL类型

from PIL import Image

pic = request.FILES["picture"]
im_pic = Image.open(pic)
# 这样就把InMemoryUploadedFile转化为了PIL类型数据,pic是InMemoryUploadedFile,im_pic是PIL类型

3. 处理PIL类型的图片数据

w, h = im_pic.size
if w >= h:
  w_start = (w-h)*0.618
  box = (w_start, 0, w_start+h, h)
  region = im_pic.crop(box)
else:
  h_start = (h-w)*0.618
  box = (0, h_start, w, h_start+w)
  region = im_pic.crop(box)

# region就是PIL处理后的正方形了

4. 将处理后的PIL类型转化为InMemoryUploadedFile类型

from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile

// 先保存到磁盘io
pic_io = BytesIO()
region.save(pic_io, im_pic.format)
// 再转化为InMemoryUploadedFile数据
pic_file = InMemoryUploadedFile(
  file=pic_io,
  field_name=None,
  name=pic.name,
  content_type=pic.content_type,
  size=pic.size,
  charset=None
)

pic_file 就是region转化后的InMemoryUploadedFile了

5. 保存InMemoryUploadedFile到数据库

from ./models import Picture

p = Picture(picture=pic_file)
p.save()

以上这篇PIL对上传到Django的图片进行处理并保存的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python爬虫lxml库处理XML和HTML文档

    Python爬虫lxml库处理XML和HTML文档

    在当今信息爆炸的时代,网络上的数据量庞大而繁杂,为了高效地从网页中提取信息,Python爬虫工程师们需要强大而灵活的工具,其中,lxml库凭借其卓越的性能和丰富的功能成为Python爬虫领域的不可或缺的工具之一,本文将深入介绍lxml库的各个方面,充分掌握这个强大的爬虫利器
    2023-12-12
  • python使用socket高效传输视频数据帧(连续发送图片)

    python使用socket高效传输视频数据帧(连续发送图片)

    本文主要介绍了python使用socket高效传输视频数据帧(连续发送图片),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Python编程根据字典列表相同键的值进行合并

    Python编程根据字典列表相同键的值进行合并

    这篇文章主要介绍了来学习Python字典列表根据相同键的值进行合并的操作方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Python生成随机数的方法详解(最全)

    Python生成随机数的方法详解(最全)

    Python生成随机数的方法有很多,譬如random模块、NumPy库、secrets模块等。本文为大家整理了五个生成随机数的方法(应该是最全的了吧),希望对大家有所帮助
    2023-02-02
  • Python使用Redis实现作业调度系统(超简单)

    Python使用Redis实现作业调度系统(超简单)

    Redis作为内存数据库的一个典型代表,已经在很多应用场景中被使用,这里仅就Redis的pub/sub功能来说说怎样通过此功能来实现一个简单的作业调度系统。这里只是想展现一个简单的想法,所以还是有很多需要考虑的东西没有包括在这个例子中,比如错误处理,持久化等
    2016-03-03
  • python获取外网ip地址的方法总结

    python获取外网ip地址的方法总结

    这篇文章主要介绍了python获取外网ip地址的方法,实例总结了四种常用的获取外网IP地址的技巧,需要的朋友可以参考下
    2015-07-07
  • pyqt5 删除layout中的所有widget方法

    pyqt5 删除layout中的所有widget方法

    今天小编就为大家分享一篇pyqt5 删除layout中的所有widget方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python生成单位阵或对角阵的三种方式小结

    python生成单位阵或对角阵的三种方式小结

    这篇文章主要介绍了python生成单位阵或对角阵的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Python学习笔记之迭代器和生成器用法实例详解

    Python学习笔记之迭代器和生成器用法实例详解

    这篇文章主要介绍了Python学习笔记之迭代器和生成器用法,结合实例形式详细分析了Python迭代器与生成器的功能、原理、定义及使用方法,需要的朋友可以参考下
    2019-08-08
  • python出现更新库失败A new release of pip is available: 23.0.1 -> 23.3解决办法

    python出现更新库失败A new release of pip is available: 23.0.

    学习了Python我们知道它自带了很多的库,同时我们还需要对某个库进行升级,这篇文章主要给大家介绍了关于python出现更新库失败A new release of pip is available: 23.0.1 -> 23.3的解决办法,需要的朋友可以参考下
    2024-03-03

最新评论