使用TinyPNG API压缩图片

news2025/1/13 10:23:59

使用TinyPNG API压缩图片

在撰写论文的时候,美观,大气,上档次的图标能够很好地给自己的论文加分,好的可视化结果也能够让审稿人赏心悦目。但是有时候在可视化图片的时候有可能原始图像过大从而很占内存;这时候就希望能够是有一个无损压缩工具来压缩图像。目前笔者尝试过TinyPNG 感觉能够达到较好的压缩效果而且基本上不影响视觉效果。而且也有对应的安装包TinyGUI, TinyGUI 是网友根据TinyPNG提供的应用程序接口开发的本地桌面端工具。它具有以下特点:

  • 无单张图片最大5M的限制
  • 无压缩图片数量限制
  • 免费且使用简单,图片拖放到界面就可以压缩

桌面端使用教程

  1. TinyGUI需要用到TinyPNG的API,这里先打开Developer API,填入用户名和邮箱,然后点击“Get Your API key”。当页面显示“We have sent you an email with a link to your API key!” 就可以到邮箱找到收到的API key了。
    在这里插入图片描述
  2. 打开TinyGUI,在“设置你的 API Key”下框中输入刚收到的API(有可能在垃圾箱里),再选择保存。
    在这里插入图片描述
  3. 选择“选择图片文件”上传需要压缩的图片,或者直接拖拽图片到“将图片拖动到此处”区域
    在这里插入图片描述
  4. 然后就可以开始等待图片压缩了,可以看到TinyPNG可以将1.5MB的图片压缩到637.4KB,压缩了57%,非常不错。
    在这里插入图片描述

但是又到了但是环节。
本地桌面端工具用起来虽然比较方便,但是当图片比较多,或者图片存在多个文件夹下时就没那么方便了,作为一名程序猿 这时候当然想到的是用python来写一份调用API遍历文件夹的程序咯。

Python调用TinyPNG API 遍历文件夹压缩图片

同样的也需要使用上面的第一步来获取API key

# -*- coding:utf-8 -*-
# 使用tinypng API压缩项目图片
import tinify
import os
import time
from os.path import join, getsize
import math

# 压缩图片的key
online_key_list = [
    "FCBMvlXLZzGKxwLBQ0CCl4hyrpLMWKt*",
    "FCBMvlXLZzGKxwLBQ0CCl4hyrpLMWKt*",  # 可以继续添加  防止一个key不够
]

# 获取key
online_key_list_iter = iter(online_key_list)
online_key = next(online_key_list_iter)
tinifyAPi = tinify.tinify

def size_format(size, dot=2):
    ## 文件大小 单位转化
    if 1 <= size < 1024:
        human_size = str(round(size, dot)) + 'B'
    # 千字节 千字节 Kilo Byte
    elif math.pow(1024, 1) <= size < math.pow(1024, 2):
        human_size = str(round(size / math.pow(1024, 1), dot)) + 'KB'
    # 兆字节 兆 Mega Byte
    elif math.pow(1024, 2) <= size < math.pow(1024, 3):
        human_size = str(round(size / math.pow(1024, 2), dot)) + 'MB'
    # 吉字节 吉 Giga Byte
    elif math.pow(1024, 3) <= size < math.pow(1024, 4):
        human_size = str(round(size / math.pow(1024, 3), dot)) + 'GB'
    # 太字节 太 Tera Byte
    elif math.pow(1024, 4) <= size < math.pow(1024, 5):
        human_size = str(round(size / math.pow(1024, 4), dot)) + 'TB'
    return human_size


# 在线压缩
def compress_online(sourcefile):
    global online_key
    compresskey = online_key
    tinify.key = compresskey
    rs = False
    outputfile = sourcefile
    old_size = getsize(sourcefile)
    try:
        source = tinifyAPi.from_file(sourcefile)
        source.to_file(outputfile)
        new_size = getsize(outputfile)
        sub_size = old_size - new_size
        print('保存路径:{} | 压缩前文件大小:{}; 压缩后文件大小:{}; 压缩比例:{:.2}%'.format(outputfile, size_format(old_size),
                                                                     size_format(new_size), sub_size / new_size * 100))
        rs = True
        pass
    except tinify.AccountError:
        # Verify your API key and account limit.
        # 如果key值无效 换一个key继续压缩
        print("key值无效 换一个继续。。。")
        online_key = next(online_key_list_iter)
        compress_online(sourcefile)  # 递归方法 继续读取
        rs = True

    except tinify.ClientError:
        # Check your source image and request options.
        print("Check your source image and request options.")
        rs = False
        pass
    except tinify.ServerError:
        # Temporary issue with the Tinify API.
        # print("Temporary issue with the Tinify API. %s" % e.message)
        print("Temporary issue with the Tinify API.")

        rs = False
        pass
    except tinify.ConnectionError:
        # A network connection error occurred.
        print("网络故障。。。休息1秒继续")
        time.sleep(1)
        compress_online(sourcefile)  # 递归方法 继续读取
        rs = True
        pass
    except Exception:
        # Something else went wrong, unrelated to the Tinify API.
        print("Something else went wrong, unrelated to the Tinify API.")
        rs = False
        pass
    return rs


def fileofdir_iterate(path):
    folderlist = os.listdir(path)  # 列举文件夹
    folderlist.sort()
    for item in folderlist:
        item_name = os.path.join(path, item)
        if os.path.isfile(item_name):
            compress_online(item_name)
        else:
            fileofdir_iterate(item_name)

if __name__ == '__main__':
    dir_path = r"D:\Desktop\fig\figures\examples\GF2"
    fileofdir_iterate(dir_path)

上面的程序参考了:https://github.com/haoma2012/PythonProject/blob/master/ComPressPic.py。
这里作者直接把压缩后的图片替换了原始的图片,可以根据自己的需求来调整输出结果的存放位置。
以上便是本次分享,如有问题可添加笔者QQ:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Numpy+CV2/GDAL实现对图像的Wallis匀色

Wallis匀色原理&#xff1a; # f(x,y)&#xff1a;Wallis匀色后结果 # g(x,y):输入的待匀色影像 # mg:待处理影像的灰度均值 # mf:参考影像的灰度均值 # sg:待处理影像和的标准偏差 # sf:参考影像的标准偏差 f(x,y)(g(x,y)−mg)⋅(sf/sg)mf匀色代码逻辑解释&#xff1…

从阿里云“数字证书管理服务”申请免费的SSL证书

最近网站的SSL证书即将到期&#xff0c;之前是从FreeSSL申请的证书&#xff0c;而且是通过OpenSSL自己生成CSR文件的方式申请的证书&#xff0c;操作还是比较繁琐。&#xff08;具体参考&#xff1a; https://blog.csdn.net/weixin_42534940/article/details/90745452 &#xf…

一、几种常用的设计模式

设计模式分类 创建者模式&#xff1a;对象实例化的模式&#xff0c;创建型模式用于解耦对象的实例化过程。 常用&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式 。 不常用&#xff1a;原型模式结构型模式&#xff1a;把类或对象结合在一起形成一个更大的结构。…

Tilemap瓦片资源

1、Tilemap Tilemap一般称之为 瓦片地图或者平铺地图&#xff0c;是Unity2017中新增的功能&#xff0c;主要用于快速编辑2D游戏中的场景&#xff0c;通过复用资源的形式提升地图多样性 工作原理就是用一张张的小图排列组合为一张大地图 它和SpriteShape都是用于制作2D游戏的…

CEAC 之《企业信息化管理》1

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;微微的猪食小窝 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1综合布线是智能建筑的信息高速公路。 A、正确 B、错误A2直通线的一根双绞线的两端执行不同…

Java基础实战项目-------网上订餐系统

目录 前言 项目需求 项目环境准备 技能点 实现思路 ​编辑 项目总结 完整代码&#xff1a; 前言 已学完Java基础部分的内容&#xff0c;如下 理解程序的基本概念&#xff1a;程序、变量、数据类型 会使用顺序、选择、循环、跳转语句编写程序 会使用数组以及Arrays的…

[附源码]SSM计算机毕业设计智慧教学平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计生产型企业员工管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

应急响应-账户排查

用户信息排查 在服务器被入侵之后&#xff0c;攻击者可能会建立相关账户&#xff0c;方便进行远程控制。 主要采用一下几种&#xff1a; 直接建立一个新用户&#xff1b;(有时候为了混淆视听&#xff0c;账户名称和系统常用名相似)激活一个系统中的默认用户&#xff0c;但是这…

ArcGIS计算图斑四至坐标原来这么简单!可不要在走弯路哦

时常我们需要去计算图斑的四至坐标 &#xff08;四至与四至点不一样哦&#xff09; 很多朋友会去求个 最小边界几何 在与原始图斑相交得到点来算四至 这种方法有许多问题 是不可以取的&#xff0c;我们今天来介绍一下 一个简单的字段计算就解决这个问题 然后嫌麻烦 我们…

jtag调试ls1012a linux-5.3内核

1、jtag连接 OK1012A-C jtag引脚如下: 如果jlink的VCC对外输出供电&#xff0c;那么需要关闭&#xff0c;VCC对外供电导致jtag连接不上。使用引脚匹配的转接板连接开发板的jtag插座。使用交叉串口线连接开发板。 2、linux-5.3内核编译 -O0编译修改方法与树莓派4b编译修改方法一…

java基于ssm大学生社团管理系统-计算机毕业设计

系统采用了B/S结构&#xff0c;将所有业务模块采用以浏览器交互的模式&#xff0c;选择MySQL作为系统的数据库&#xff0c;开发工具选择My eclipse来进行系统的设计。基本实现了社团管理应有的主要功能模块&#xff0c;本系统有前台与后台两大功能模块&#xff0c;管理员&#…

【图像隐藏】基于小波变换DWT实现数字水印嵌入提取含各类攻击附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

OPT(奥普特)荣摘高工锂电“2022年度创新技术奖”

日前&#xff0c;高工锂电年会暨金球奖颁奖典礼在深圳隆重举行&#xff0c;集结了锂电产业链上下游企业高层领袖&#xff0c;围绕行业新技术、数字工厂、极限智造等共议未来发展之道。 作为锂电行业机器视觉核心供应商&#xff0c;OPT&#xff08;奥普特&#xff09;受邀出席年…

【Java八股文总结】之面向对象

文章目录Java面向对象基础一、面向对象基础1、什么是封装&#xff1f;2、什么是继承&#xff1f;1、子类访问父类2、子类的访问修饰符3、方法重写3、什么是多态&#xff1f;1、Java语言如何实现多态2、什么时候使用多态&#xff1f;4、什么是接口&#xff1f;5、怎么使用接口&a…

Stream

目录 一 函数式接口 1 特点 2 核心函数式接口 1&#xff09; Consumer 2&#xff09; Supplier 3&#xff09; Function 4&#xff09; Predicate 5&#xff09; 扩展&#xff1a;BiFunction 二 Stream 1 stream操作过程 1&#xff09; 中间操作 2&#xff09;终端…

[附源码]java毕业设计汽车票售票系统lunwen

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

太湖“生态度假式”年会,为您的健康守护,为您的相聚喝彩

最近几年经常听到&#xff0c; 有人说今年最大的目标就是活着&#xff0c; 历经风雨&#xff0c;方知岁月静好的可贵&#xff0c; 这特殊的一年又一年里让大家深觉“健康”的重要&#xff0c; 也让我们更热爱彼此、热爱生活。 倏忽间&#xff0c;2022已至尾声&#xff0c; 又到…

【ASM】字节码操作 工具类与常用类 GeneratorAdapter 介绍

文章目录 1.概述2. GeneratorAdapter2.1 class info2.2 fields2.3 构造方法2.4 方法2.5 特殊方法2.5.1 loadThis2.5.2 getArgIndex2.5.2 box &3. 案例4.总结1.概述 在上一篇文章中:【ASM】字节码操作 工具类与常用类 AdviceAdapter 介绍 打印方法进入 和 方法退出 的参数…

[附源码]SSM计算机毕业设计远程在线教育平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…