python压缩图片、视频

图片压缩使用zlib库
视频压缩使用工具ffmpeg


  1. # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 147fss.mp4
  2. # -i 输入的视频文件
  3. # -r 每一秒的帧数,一秒10帧大概就是人眼的速度
  4. # -pix_fmt 设置视频颜色空间 yuv420p网络传输用的颜色空间 ffmpeg -pix_fmts可以查看有哪些颜色空间选择
  5. # -vcodec 软件编码器,通用稳定
  6. # -preset 编码机预设 编码机预设越高占用CPU越大 有十个参数可选 ultrafast superfast veryfast(录制视频选用) faster fast medium(默认) slow slower veryslow(压制视频时一般选用) pacebo
  7. # -profile:v 压缩比的配置 越往左边压缩的越厉害,体积越小 baseline(实时通信领域一般选用,画面损失越大) Extended Main(流媒体选用) High(超清视频) High 10 High 4:2:2 High 4:4:4(Predictive)
  8. # -level:v 对编码机的规范和限制针对不通的使用场景来操作,也就是不同分辨率设置不同的值
  9. # -crf 码率控制模式 用于对画面有要求,对文件大小无关紧要的场景 0-51都可以选择 0为无损 一般设置18 - 28之间 大于28画面损失严重
  10. # -acodec 设置音频编码器
  11. '''
  12. import sys
  13. from PIL import Image
  14. import os
  15. import zlib
  16. import threading
  17. import platform
  18. class ZipPictureOrVideo(object):
  19. """
  20. 压缩图片、视频
  21. """
  22. def __init__(self, filePath, inputName, outName=""):
  23. self.filePath = filePath # 文件地址
  24. self.inputName = inputName # 输入的文件名字
  25. self.outName = outName # 输出的文件名字
  26. self.system_ = platform.platform().split("-", 1)[0]
  27. if self.system_ == "Windows":
  28. self.filePath = (self.filePath + "\\") if self.filePath.rsplit("\\", 1)[-1] else self.filePath
  29. elif self.system_ == "Linux":
  30. self.filePath = (self.filePath + "/") if self.filePath.rsplit("/", 1)[-1] else self.filePath
  31. self.fileInputPath = self.filePath + inputName
  32. self.fileOutPath = self.filePath + outName
  33. @property
  34. def is_picture(self):
  35. """
  36. 判断文件是否为图片
  37. :return:
  38. """
  39. picSuffixSet = {"BMP", "GIF", "JPEG", "TIFF", "PNG", "SVG", "PCX", "WMF", "EMF", "LIC", "EPS", "TGA", "JPG"}
  40. suffix = self.fileInputPath.rsplit(".", 1)[-1].upper()
  41. if suffix in picSuffixSet:
  42. return True
  43. else:
  44. return False
  45. @property
  46. def is_video(self):
  47. """
  48. 判断文件是否为视频
  49. :return:
  50. """
  51. videoSuffixSet = {"WMV", "ASF", "ASX", "RM", "RMVB", "MP4", "3GP", "MOV", "M4V", "AVI", "DAT", "MKV", "FIV",
  52. "VOB"}
  53. suffix = self.fileInputPath.rsplit(".", 1)[-1].upper()
  54. if suffix in videoSuffixSet:
  55. return True
  56. else:
  57. return False
  58. def compress_picture(self):
  59. """
  60. 压缩图片
  61. :return:
  62. """
  63. fpsize = os.path.getsize(self.fileInputPath) / 1024 # 获得图片多少K os.path.getsize(self.picPath)返回的是字节
  64. if fpsize >= 50.0: # 是否大于50K
  65. im = Image.open(self.fileInputPath) # 打开图片
  66. imBytes = im.tobytes() # 把图片转换成bytes流
  67. imBytes = zlib.compress(imBytes, 5) # 对图像字节串进行压缩
  68. im2 = Image.frombytes('RGB', im.size, zlib.decompress(imBytes)) # 压缩成新的图片
  69. if self.outName:
  70. im2.save(self.fileOutPath) # 不覆盖原图
  71. return (self.fileOutPath, os.path.getsize(self.fileOutPath))
  72. else:
  73. im2.save(self.fileInputPath) # 覆盖原图
  74. return (self.fileInputPath, os.path.getsize(self.fileInputPath))
  75. else:
  76. return True
  77. def compress_video(self):
  78. """
  79. 压缩视频
  80. :return:
  81. """
  82. fpsize = os.path.getsize(self.fileInputPath) / 1024
  83. if fpsize >= 150.0: # 大于150KB的视频需要压缩
  84. if self.outName:
  85. compress = "ffmpeg -i {} -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 {}".format(
  86. self.fileInputPath, self.fileOutPath)
  87. isRun = os.system(compress)
  88. else:
  89. compress = "ffmpeg -i {} -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 {}".format(
  90. self.fileInputPath, self.fileInputPath)
  91. isRun = os.system(compress)
  92. if isRun != 0:
  93. return (isRun, "没有安装ffmpeg,在Linux使用【apt install ffmpeg】安装,windows去【ffmpeg】官网下载")
  94. return True
  95. else:
  96. return True
  97. def start_compress_pic(self, is_async=True):
  98. """
  99. 开始压缩图片
  100. :param is_async: 是否为异步压缩,默认为TRue
  101. :return:
  102. """
  103. if is_async:
  104. # 异步保存打开下面的代码,注释同步保存的代码
  105. thr = threading.Thread(target=self.compress_picture)
  106. thr.start()
  107. else:
  108. # 下面为同步保存
  109. self.compress_picture()
  110. def start_compress_video(self, is_async=True):
  111. """
  112. 开始压缩视频
  113. :param is_async: 是否为异步压缩,默认为TRue
  114. :return:
  115. """
  116. if is_async:
  117. # 异步保存打开下面的代码,注释同步保存的代码
  118. thr = threading.Thread(target=self.compress_video)
  119. thr.start()
  120. else:
  121. # 下面为同步代码
  122. self.compress_video()
  123. if __name__ == "__main__":
  124. # 输入文件路径
  125. args = sys.argv[1:]
  126. file = ZipPictureOrVideo(args[0], args[1], args[2])
  127. if file.is_picture:
  128. print(file.start_compress_pic())
  129. elif file.is_video:
  130. print(file.start_compress_video())
  131. else:
  132. print('该文件不是图片或者视频')

参考文章:【https://blog.csdn.net/a849992683/article/details/90030326】

python使用zlib库压缩图片,使用ffmpeg压缩视频的更多相关文章

  1. python中用Pillow库进行图片处理

    一.Python中 PIL 图像处理库简介 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图, ...

  2. python利用PIL库使图片高斯模糊

    一.安装PIL PIL是Python Imaging Library简称,用于处理图片.PIL中已经有图片高斯模糊处理类,但有个bug(目前最新的1.1.7bug还存在),就是模糊半径写死的是2,不能 ...

  3. C#压缩图片——高质量压缩方式

    传入Bitmap对象,以及新图片的长宽(Bitmap.Size),这样生成的就是跟原图尺寸一致的低质量图片 public Bitmap GetImageThumb(Bitmap mg, Size ne ...

  4. 前端压缩图片,前端压缩图片后转换为base64.

    今天利用一上午研究了一下前端如何将5m左右的照片转换base64大小为 100k以内! 有两个链接:https://www.cnblogs.com/007sx/p/7583202.html :http ...

  5. 使用Python轻松批量压缩图片

    在互联网,图片的大小对一个网站的响应速度有着明显的影响,因此在提供用户预览的时候,图片往往是使用压缩后的.如果一个网站图片较多,一张张压缩显然很浪费时间.那么接下来,我就跟大家分享一个批量压缩图片的方 ...

  6. 10 行 Python 代码,批量压缩图片 500 张,简直太强大了

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw 熟悉 "Pyth ...

  7. 使用python内置库pytesseract实现图片验证码的识别

    环境准备: 1.安装Tesseract模块 git文档地址:https://digi.bib.uni-mannheim.de/tesseract/ 下载后就是一个exe安装包,直接右击安装即可,安装完 ...

  8. [Zlib]_[初级]_[使用zlib库压缩和解压STL string]

    场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说 ...

  9. tinypng的python批量压缩图片功能

    tinypng网站提供的图片压缩功能很不错,但是直接在网站上压缩有限制,大量压缩图片时比较麻烦,还好官方提供了很多脚本的自动化压缩接口.下面简单说下python批量压缩步骤. 1.申请api key ...

随机推荐

  1. (转载)什么是B+树?

    本文转载自网络. 如有侵权,请联系处理!  

  2. Spring 配置文件AOP

    1 <!-- 配置切面bean --> 2 <bean id="permAspect" class="com.tx.spring.aspect.Perm ...

  3. Web Storage API的介绍和使用

    目录 简介 浏览器的本地存储技术 Web Storage相关接口 浏览器兼容性 隐身模式 使用Web Storage API 总结 简介 Web Storage为浏览器提供了方便的key value存 ...

  4. C#实现——十大排序算法之选择排序

    选择排序法 1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1.2过程,直到排序完成. 2. ...

  5. 从远程库github.com克隆代码时遇到了如下的问题:

    Warning: Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hos ...

  6. Zookeeper基础理论

    Zookeeper是分布式开源协调服务, 主要用来解决分布式集群中应用系统的一致性问题. 本质上是分布式小文件存储系统.   特性 全局数据一致性(集群中每个服务器保存一份相同的数据副本,Client ...

  7. python之多态

    python之多态 一.什么是多态? 同一种事物,有多种形态! class Animal: #同一类事物:动物 def talk(self): pass class Cat(Animal): #动物的 ...

  8. Word+Excel 问题及解决

    [Word] 快捷操作 (1)每个字后面都有换行符的处理办法: 替换:∧p -> 空格 (2)隐藏Word文档中的换行符: word选项 -> 显示 -> 段落标记 [Excel]

  9. 解决vue、js 下载图片浏览器默认预览而不是下载

    在网页上,如果我们下载的地址对应的是一个jpg文件,txt文件等,点击链接时,浏览器默认的是打开这些文件而不是下载,那么如何才能实现默认下载呢? 后端解决 这就是Content-Disposition ...

  10. Linux输入子系统 转载

    NQian 记录成长~ 首页 新随笔 联系 订阅 管理 随笔 - 305  文章 - 0  评论 - 254 12.Linux之输入子系统分析(详解)   在此节之前,我们学的都是简单的字符驱动,涉及 ...