python调用TinyPNG进行图片无损压缩

jupiter
2023-05-15 / 0 评论 / 350 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年05月15日,已超过340天没有更新,若内容或图片失效,请留言反馈。

1.TinyPNG介绍

TinyPNG是一种在线图片压缩工具,可以将图片压缩到更小的文件大小,而且不会对图片质量造成明显的影响。其实现原理主要是基于两个方面:压缩算法和颜色减少。

  1. 压缩算法

TinyPNG使用的是一种叫做Deflate的压缩算法。Deflate算法是一种无损压缩算法,可以将图片的二进制数据进行压缩,从而减小图片文件的大小。在Deflate算法中,压缩的主要思想是利用重复的数据进行替换,从而减小文件的大小。

具体来说,Deflate算法主要包括两个步骤:压缩和解压缩。在压缩过程中,数据被分成多个块,并且每个块都有自己的压缩字典。在解压缩过程中,压缩字典用于还原压缩后的数据。

2. 颜色减少

另一个TinyPNG使用的技术是颜色减少。颜色减少是一种通过减少图片中使用的颜色数来减小文件大小的技术。在实践中,很多图片中使用的颜色实际上是不必要的,因此可以通过将这些颜色删除来减小文件的大小。

具体来说,TinyPNG会先对图片进行一个预处理,找出图片中使用频率最低的颜色,并将其替换成使用频率更高的颜色。这个过程是基于一个叫做K-means的算法实现的。K-means算法是一种基于聚类的算法,可以将图片中使用的颜色分成多个聚类,从而找出使用频率最低的颜色。

2.python调用TinyPNG API进行图片压缩

  • 安装依赖
pip install tinify
  • 核心代码
import tinify
import os
import shutil

def img_compress_by_tinify(img_path_local,img_size_thresh = 200):
    if not os.path.exists("./images"):
        os.makedirs("./images")
    
    # 压缩前图片大小
    img_src_size = os.path.getsize(img_path_local)/1024
    
    # 压缩后图片保存地址
    img_path_compress = "./images/compress_"+img_path_local.split("/")[-1]
    
    
    # 若压缩前图片大小已经大小阈值img_size_thresh则跳过压缩
    if(img_src_size<img_size_thresh):
        print("图片大小小于"+str(img_size_thresh)+"KB,跳过压缩");
        shutil.copyfile(img_path_local,img_path_compress)
    else:
        print("压缩前图片大小:"+str(int(img_src_size))+"KB")
        
        # 调用tinyPNG进行图片压缩
        tinify.key  = "V02hTQyPz4WRXPyCChGv6nJJTZYVtzcd"
        source = tinify.from_file(img_path_local)
        source.to_file(img_path_compress)
        
        # 压缩后图片大小
        img_compress_size = os.path.getsize(img_path_compress)/1024
        print("压缩后图片大小:"+str(int(img_compress_size))+"KB")
    
    return img_path_compress

img_path_local = "./images/1684153992017.jpg"
img_path_compress = img_compress_by_tinify(img_path_local)
print(img_path_compress)
  • 调用结果
压缩前图片大小:693KB
压缩后图片大小:148KB
./images/compress_1684153992017.jpg
0

评论 (0)

打卡
取消