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

简介: python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片

1 python+opncv实现图片的压缩

class Compress_img:

    def __init__(self, img_path):
        self.img_path = img_path
        self.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_path
        self.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.size
            img_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.size
            img.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次
image.png

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
    image.png

2、打开邮件跳转获取Key
image.png

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

import tinify

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

实测:

  • 压缩前图片大小:3.53M
  • 压缩后图片大小:627kb
  • 压缩比率:$compress_rate = \frac{3.53 \times1024kb-627kb}{3.53 \times1024 kb}\times100\% \approx82.7\%$
  • 压缩3.53M图片用时:29s

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

3.2.3 tingypng优缺点:

优点:

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

缺点:

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

4 python+pngquant实现图片的压缩

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

使用:

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 = \frac{2.81 \times1024kb-733kb}{2.81 \times1024 kb}\times100\% \approx74.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')
目录
相关文章
|
11天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
1月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
73 20
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
166 3
|
28天前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
69 21
|
26天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
32 10
|
28天前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
61 10
|
2月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
3月前
|
算法 决策智能 Python
Python中解决TSP的方法
旅行商问题(TSP)是寻找最短路径,使旅行商能访问每个城市一次并返回起点的经典优化问题。本文介绍使用Python的`ortools`库解决TSP的方法,通过定义城市间的距离矩阵,调用库函数计算最优路径,并打印结果。此方法适用于小规模问题,对于大规模或特定需求,需深入了解算法原理及定制策略。
71 15
|
2月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
410 5
|
3月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
216 4

热门文章

最新文章

推荐镜像

更多