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)
目录
相关文章
|
2月前
|
人工智能 Java API
Python 潮流周刊#28:两种线程池、四种优化程序的方法
Python 潮流周刊#28:两种线程池、四种优化程序的方法
22 1
|
2月前
|
编译器 Python
Python优化机制:常量折叠
Python优化机制:常量折叠
24 0
|
1月前
|
算法 索引 Python
Python3实现旋转数组的3种算法
Python3实现旋转数组的3种算法
21 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
59 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
50 0
|
2月前
|
数据可视化 数据挖掘 调度
【Python数据挖掘】优化电能能源策略:基于非侵入式负荷检测与分解的智能解决方案
【Python数据挖掘】优化电能能源策略:基于非侵入式负荷检测与分解的智能解决方案
34 0
|
10天前
|
缓存 监控 算法
优化Python代码性能的10个技巧
提高Python代码性能是每个开发者都需要关注的重要问题。本文将介绍10个实用的技巧,帮助你优化Python代码,提升程序的运行效率和性能表现。无论是避免内存泄漏、减少函数调用次数,还是使用适当的数据结构,都能在不同场景下发挥作用,使你的Python应用更加高效稳定。
|
2天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
25 7
|
4天前
|
缓存 算法 Python
优化Python代码的十大技巧
本文介绍了十种优化Python代码的技巧,涵盖了从代码结构到性能调优的方方面面。通过学习和应用这些技巧,你可以提高Python程序的执行效率,提升代码质量,以及更好地应对复杂的编程任务。
|
12天前
|
Python
471: 旋转字(python)
471: 旋转字(python)