Python3 使用pli优化图片大小,相机或手机拍图片根据exif旋转、纠正方向

简介: 首先安装 pip install pillow 如果报错,请根据报错的信息去搜索一下,一般都能得到解决,未找到请升级pip python -m pip install --upgrade pip 或者 pip install --upgrade pip 那么写个方法 from PIL import.

首先安装

pip install pillow

如果报错,请根据报错的信息去搜索一下,一般都能得到解决,未找到请升级pip

python -m pip install --upgrade pip

或者

pip install --upgrade pip

那么写个方法

from PIL import Image,ExifTags

#定义保存图片都路径
def get_outfile(infile, outfile):
  if outfile:
  return outfile
  dir, suffix = os.path.splitext(infile)
  outfile = '{}-cover{}'.format(dir, suffix)
  return outfile
 
#缩小图片大小,保持原始宽高
def compress_image(infile, outfile='', kb=3200, step=5, quality=80):
  o_size = os.path.getsize(infile) / 1024
  if o_size <= kb:
    return False
  outfile = self.get_outfile(infile, outfile)
  while o_size > kb:
    img = Image.open(infile)
    #相机或手机拍摄图片需要根据exif旋转角度
    try:
      for orientation in ExifTags.TAGS.keys():
        if ExifTags.TAGS[orientation] == 'Orientation': break
      exif = dict(img._getexif().items())
      if exif[orientation] == 3:
        img = img.rotate(180, expand=True)
      elif exif[orientation] == 6:
        img = img.rotate(270, expand=True)
      elif exif[orientation] == 8:
        img = img.rotate(90, expand=True)
    except:
      pass
    img.save(outfile, quality=quality)
  if quality - step < 0:
  break
  quality -= step
  o_size = os.path.getsize(outfile) / 1024
  return outfile
compress_image(infile, outfile='', kb=3200, step=5, quality=80)
infile : 原始图片路径
outfile: 生成图片保存路径
kb     : 图片压缩上限,单位kb
step   : 每次压缩质量,
quality: 图片质量,jpg特有,最高为100的质量

使用

small_path = compress_image(image_path)
if not small_path:
small_path = image_path

在某个项目中用到,就记录一下吧~特别是碰到图片上传后改变了方向的,特别郁闷,所以找到了解决方案

img = Image.open(infile)
    #相机或手机拍摄图片需要根据exif旋转角度
    try:
      for orientation in ExifTags.TAGS.keys():
        if ExifTags.TAGS[orientation] == 'Orientation': break
      exif = dict(img._getexif().items())
      if exif[orientation] == 3:
        img = img.rotate(180, expand=True)
      elif exif[orientation] == 6:
        img = img.rotate(270, expand=True)
      elif exif[orientation] == 8:
        img = img.rotate(90, expand=True)
    except:
      pass
    img.save(outfile, quality=100)
目录
相关文章
|
机器学习/深度学习 算法 安全
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
492 0
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
292 0
|
11月前
|
传感器 机器学习/深度学习 算法
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
349 2
|
11月前
|
机器学习/深度学习 资源调度 算法
一种多尺度协同变异的粒子群优化算法(Python代码实现)
一种多尺度协同变异的粒子群优化算法(Python代码实现)
266 2
|
12月前
|
机器学习/深度学习 算法 Java
基于改进粒子群优化算法的柔性车间调度问题(Python代码实现)
基于改进粒子群优化算法的柔性车间调度问题(Python代码实现)
375 4
|
监控 大数据 API
Python 技术员实践指南:从项目落地到技术优化
本内容涵盖Python开发的实战项目、技术攻关与工程化实践,包括自动化脚本(日志分析系统)和Web后端(轻量化API服务)两大项目类型。通过使用正则表达式、Flask框架等技术,解决日志分析效率低与API服务性能优化等问题。同时深入探讨内存泄漏排查、CPU瓶颈优化,并提供团队协作规范与代码审查流程。延伸至AI、大数据及DevOps领域,如商品推荐系统、PySpark数据处理和Airflow任务编排,助力开发者全面提升从编码到架构的能力,积累高并发与大数据场景下的实战经验。
Python 技术员实践指南:从项目落地到技术优化
|
11月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
11月前
|
算法 定位技术 调度
基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)
基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)
448 0
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
11月前
|
算法 安全 新能源
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
774 0

推荐镜像

更多