python多种方法压缩图片,opencv、PIL、tinypng压缩图片

文章目录:

  • 1 python+opncv实现图片的压缩
  • 2 python+PIL实现图片的压缩
  • 3 python+tinypng实现图片的压缩
    • 3.1 tinypng介绍
    • 3.2 tinypng压缩图片API使用
      • 3.2.1 tingypng安装
      • 3.2.2 tingypng安装
      • 3.2.3 tingypng优缺点:
  • 4 python+pngquant实现图片的压缩

1 python+opncv实现图片的压缩

class Compress_img:def __init__(self, img_path):self.img_path = img_pathself.img_name = img_path.split('/')[-1]def compress_img_CV(self, compress_rate=0.5, show=False):img = cv2.imread(self.img_path)heigh, width = img.shape[:2]# 双三次插值img_resize = cv2.resize(img, (int(heigh*compress_rate), int(width*compress_rate)),interpolation=cv2.INTER_AREA)cv2.imwrite('result_cv_' + self.img_name, img_resize)print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate)if show:cv2.imshow(self.img_name, img_resize)cv2.waitKey(0)if __name__ == '__main__':img_path = './ym.jpg'compress = Compress_img(img_path)# 使用opencv压缩图片compress.compress_img_CV()

2 python+PIL实现图片的压缩

class Compress_img:def __init__(self, img_path):self.img_path = img_pathself.img_name = img_path.split('/')[-1]def compress_img_PIL(self, way=1, compress_rate=0.5, show=False):'''img.resize() 方法可以缩小可以放大img.thumbnail() 方法只能缩小:param way::param compress_rate::param show::return:'''img = Image.open(self.img_path)w, h = img.size# 方法一:使用resize改变图片分辨率,但是图片内容并不丢失,不是裁剪if way == 1:img_resize = img.resize((int(w*compress_rate), int(h*compress_rate)))resize_w, resieze_h = img_resize.sizeimg_resize.save('result_' + self.img_name)if show:img_resize.show()  # 在照片应用中打开图片# 或# plt.imshow(img_resize)# plt.axis('off')# plt.show()# 方法二: 和resize方法类似,不过这里我测试好型这个函数已经不能使用,不知是不是版本问题# 问题:https://blog.csdn.net/kethur/article/details/79992539  tumbnail没有返回值if way == 2:# img_resize = img.thumbnail((400, 400))img.thumbnail((int(w*compress_rate), int(h*compress_rate)))resize_w, resize_h = img.sizeimg.save('result2_' + self.img_name)print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate)if __name__ == '__main__':img_path = './ym.jpg'compress = Compress_img(img_path)# 使用PIL压缩图片compress.compress_img_PIL(way=1, show=True)

3 python+tinypng实现图片的压缩

3.1 tinypng介绍

打开它的官网https://tinypng.com发现其提供线上上传图片进行压缩,看到例子介绍压缩率还是蛮可观的,而且压缩前后对图片影响不大。我们点进去DEVELOPER API,可以看出tingpng支持很多变成语言API,如下:

  • HTTP
  • RUBY
  • PHP
  • NODE.JS
  • PYTHON
  • JAVA
  • .NET

tinypng对图片的压缩率可以达到惊人的90%(例如:一张20M的图片可以被压缩到2M),除了对图片压缩,它的 API 还提供图片裁剪、加水印、保存压缩图片至云服务商(亚马逊云、谷歌云)等功能,非常强大

tinypng并不是完全免费的每个月可以免费调用API使用500次

3.2 tinypng压缩图片API使用

3.2.1 tingypng安装

先安装tinypng

pip install --upgrade tinify

3.2.2 tingypng安装

1、申请API使用,生成key

在官网,填写your full nameyour email,填写好之后你会收到一封邮件

  • full name:shliang
  • email:shliang0603@gmail.com

    2、打开邮件跳转获取Key

3、python + tinypng实现图片压缩
获取到专属的Key之后,你就可以使用相应的API实现图片的压缩了

import tinifytinify_keys = ""YOUR_API_KEY""
source = tinify.from_file("test.jpg")
source.to_file("compress_img.jpg")

实测:

  • 压缩前图片大小:3.53M
  • 压缩后图片大小:627kb
  • 压缩比率:compress_rate=3.53×1024kb−627kb3.53×1024kb×100%≈82.7%compress\_rate = \frac{3.53 \times1024kb-627kb}{3.53 \times1024 kb}\times100\% \approx82.7\%compress_rate=3.53×1024kb3.53×1024kb−627kb​×100%≈82.7%
  • 压缩3.53M图片用时:29s

图片压缩的时间比较长,但是图片压缩的效果非常好,首先压缩后图片的分辨率保持不变,其次压缩后图片的清晰度和原图几乎一样,真的很牛!(我严重怀疑这是通过一种深度学习方法实现的[捂脸])

3.2.3 tingypng优缺点:

优点:

  • 图片压缩比率高
  • 几乎可以实现无损压缩
  • 压缩不改变图片分辨率

缺点:

  • 压缩时间比较长
  • 收费:显然这对于一个工程应用是不能使用的

4 python+pngquant实现图片的压缩

pngquant是国外一个有损的PNG压缩库,介绍称结合vector quantization算法生成高质量的色彩范围,用脚本同样可以处理批量图片压缩。其支持命令行和源码库形式使用,这里介绍的是使用命令行方式:

  • pngquant只能对png图片进行压缩
  • 官方称:图片的压缩率可以达到70%

官网:https://pngquant.org/

使用:

import subprocess
#需修改为你自己本地pnguant.exe路径
PNGQUANT_PATH = r'Your path\pngquant.exe'
...
cmd_command = '"{0}" 256 -s1 --force --quality=50-50 "{1}" -o "{2}"'.format(PNGQUANT_PATH, "unoptimized.png", "optimized.png")
#执行命令
p = subprocess.Popen(cmd_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
retval = p.wait()

实测:

  • 压缩前图片大小:2.81M
  • 压缩后图片大小:733kb
  • 压缩比率:compress_rate=2.81×1024kb−733kb2.81×1024kb×100%≈74.5%compress\_rate = \frac{2.81 \times1024kb-733kb}{2.81 \times1024 kb}\times100\% \approx74.5\%compress_rate=2.81×1024kb2.81×1024kb−733kb​×100%≈74.5%

##4.2 jpg图片转换成png图片

由于jpg图片时没有alpha通道的,而pngquant只能对png图片进行压缩。因此,因此我的想法是这样的:

  • 1、把jpg图片转化成png图片

  • 2、使用pngquant对压缩的图片进行压缩

  • 3、把压缩后的png图片再转换成jpg图片

  • JPEG - JPEG图像旨在通过删除人眼不会注意到的信息,使详细的摄影图像尽可能小。因此,与PNG相比,图像的尺寸相当小。但是在JPG图像中,您无法存储图像的Alpha透明度信息。因此,如果不需要透明度信息,JPG是最具可扩展性的解决方案。

  • PNG - PNG是一种很好的格式,它将无损编码与直接颜色(数千种颜色,就像JPEG)相结合。它支持alpha透明度。保存为PNG的照片可能比同等JPEG图像大至少5倍,可见质量几乎没有改善。因此,如果文件大小不是问题,并且您希望获得最佳质量,那么PNG就是好的。

###4.2.1 jpg图片转换成png图片

1

2、方法二:使用`PythonMagick库实现jpg转换png

PythonMagick库无法用pip或者easy_install来安装,因此,需要手动安装,地址如下(非官方的python库包):

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pythonmagick

选择合适版本下载后,进入文件所在位置,直接pip install + 文件名即可完成安装。

import PythonMagick# 1 使用PythonMagick图片格式转换 jpg2png   jpg:3.71M-> png:13.74M
im = PythonMagick.Image('./test.jpg')
# im.sample('128x128')
im.write('output.png')# 2 使用pngquant对图片压缩: png:13.74M->png:3.81M# 3 使用PythonMagick图片格式转换 png2jpg   png:3.81M->jpg:4.81M  (笑cry)
im = PythonMagick.Image('./output.png')
# im.sample('128x128')
im.write('output.jpg')

实测:

  • 一样3.71M的jpg图片
  • 转换成png图片大小为:13.74M

然后再使用pngquant压缩,压缩后的图片大小为:3.63M,压缩后的图片有一定的信息损失

###4.2.2 png图片转换成jpg图片

在从PNG转换为JPG时,我们以jpeg格式创建新图像文件,读取png图像,然后将读取的图像粘贴到新创建的空白jpg图像。然后保存jpg图像文件。这是从PNG转换为JPG背后的基本思想。

from PIL import Image# png: 3.81M -> jpg:1.49M
im = Image.open("output.png")
rgb_im = im.convert('RGB')
rgb_im.save('result_PIL_jpg2png.jpg')

from PIL import Image
im = Image.open("output.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save('result_PIL_jpg2png2.jpg')

参考:https://blog.csdn.net/weixin_39153202/article/details/96566897 # 图片格式转换

python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片相关推荐

  1. python识别图片中数字_Python Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  2. python照片过人脸_python openCV实现摄像头获取人脸图片

    本文实例为大家分享了python openCV实现摄像头获取人脸图片的具体代码,供大家参考,具体内容如下 在机器学习中,训练模型需要大量图片,通过openCV中的库可以快捷的调用摄像头,截取图片,可以 ...

  3. Python多种方法生成菲波那切数列

    文章目录 一.顺序输出 二.利用递归函数实现 三.循环 四.利用列表实现 五.利用reduce实现 六.利用生成器实现 七.利用魔术方法实现 记录多种方法生成菲波那切数列 一.顺序输出 代码如下: # ...

  4. 开发一款图片压缩工具:使用 pngquant 实现图片压缩

    活动地址:CSDN21天学习挑战赛 开发一款图片压缩工具(二):使用 pngquant 实现图片压缩 上一篇我尝试使用了 pillow 库对 png 图片进行了压缩,效果不好.这次我换用 pngqua ...

  5. python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)

    Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...

  6. Python多种方法实现句子中单词倒置(好未来2017笔试题)

    问题描述:将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I 代码: def rev1(s):     return ' '.jo ...

  7. 手写数字图片数据之python读取保存、二值化、灰度化图片+opencv处理图片的方法

    python 读取.保存.二值化.灰度化图片+opencv处理图片的方法 进行手写数字的图片预测的时候碰到了这样的问题. 先说说处理图片有三种方式 一.matplotlib 二.PIL 三.openc ...

  8. python头像转卡通_Python实现将照片变成卡通图片的方法【基于opencv】

    本文实例讲述了Python实现将照片变成卡通图片的方法.分享给大家供大家参考,具体如下: 之前的文章介绍了使用Photoshop将照片变成卡通图片,今次介绍用代码来实现这项任务,可以就此探查各种滤镜的 ...

  9. Python + opencv对拍照得到的图片进行背景去除的实现方法

    这篇文章主要介绍了Python + opencv对拍照得到的图片进行背景去除的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 有时候我们 ...

  10. 使用游戏角色娜可露露讲述Python图像处理的方法(matplotlib、PIL和OpenCV)

      Python中除了使用OpenCV以外,使用matplotlib和PIL这两个模块,也可以对图像进行处理. 一.matplotlib 1. 显示图片 import matplotlib.pyplo ...

最新文章

  1. 机器学习 | 数据从哪里找?手把手教你构建数据集
  2. GridView总结二:GridView自带编辑删除更新
  3. CF-1249 F.Maximum Weight Subset(贪心)
  4. NetCore基于EasyNetQ的高级API使用RabbitMq
  5. c语言中通过分隔符取字符串,C语言切割多层字符串(strtok_r strtok使用方法)
  6. 截取地址栏URL参数
  7. c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)
  8. java 1000以内的完数
  9. 全球最厉害的14位程序员
  10. 最常用的springmvc注解使用技巧
  11. 鸿蒙hpm网站,【HarmonyOS HiSpark IPC试用】用hpm获取源码方式环境-hpm安装 鸿蒙HarmonyOS技术社区PCB联盟网 - Powered by Discuz!...
  12. MyEclipse 8.6VSS1.6.2 插件安装
  13. 计算机器前传:结绳、算筹、算盘等手动计算发展史(公号回复“手动计算”下载PDF资料,欢迎转发、赞赏、支持科普)
  14. Java校招基础知识总结(横扫BAT,就业经验交流会演讲稿)
  15. linux 谷歌浏览器设置代理_Linux系统下Firefox浏览器SSH代理服务器脚本及设置方法...
  16. Python wxpy 操作微信 大全集
  17. 快速提升网站排名_使用快排优化的方法
  18. vue-seamless-scroll公告组件的使用
  19. MySQL中常见的日志文件
  20. 歌手祁隆离婚再起波澜,与和合国际收购《借我星光》版权有关系吗

热门文章

  1. 80后 程序猿 单恋10年,是一种怎样的体验?
  2. 深圳随到随考,科目四随到随考,科三理论第二理论随到随考说明
  3. MySQL之B+树详解
  4. webgl漫反射公式物理原理猜测
  5. 工作篇之---PDF生成盖章
  6. 从零搭建Angular10项目
  7. android 清除某个通知,android清除通知栏消息
  8. 利器 | REST Assured 实践(二):断言实现
  9. 机械寿命预测,多步预测
  10. Windows U盘插入出现位置不可用 无法访问 拒绝访问