背景

在使用Gitee作为图床时(使用Typora+gitee+坚果云实现文档同步 - 掘金 (juejin.cn)),当插入的图片大小超过1MB时,会无法正常显示,如下图:

这就很让人头痛,比较一劳永逸的办法是使用云存储服务作为图床(如七牛云,阿里云的存储服务),如果对图片清晰度要求不是很高时,也可以通过压缩图片大小,使其小于1MB,再上传至Gitee图床。本文主要讲述使用Tinypng来压缩图片。

Tinypng简介

TinyPNG 使用智能有损压缩技术来减小 WEBP、JPEG 和 PNG 文件的文件大小。 通过有选择地减少图像中的颜色数量,存储数据所需的字节更少。

链接:TinyPNG – Compress WebP, PNG and JPEG images intelligently

Tinypng使用

手动上传图片

Tinypng可以手动单次上传20张图片(小于5MB)进行压缩处理,实测国内网络速度也相当可观!压缩完成后的图片名称与原图片一致,可以直接进行替换处理。实测效果如下图,是比较符合我们预期的。

压缩完的图片(800KB)实际效果,还是很不错的。

使用API

在Tinypng网站可以找到Developer API标签页,在该标签页中输入自己的邮箱即可收到Tinypng提供的API KEY的访问链接,

下图即是Tinypng的API Dshboard,在这个页面我们可以看到自己的API Key,在脚本中使用需要使用该KEY进行身份校验。同时,该页面也会显示免费额度的使用情况,每个邮箱用户每月有500张图片压缩使用额度。我们的使用需求是超过1MB大小的图片进行压缩,因此这个额度足够我们使用了。

调用API自动上传超过1MB图片

我们可以自己编写python脚本通过调用API来实现图片的自动上传压缩。API教程可以参考官方文档:TinyPNG – API Reference

安装tinyfy

我们可以使用以下命令安装tinify,可以在Github找到源代码。

pip install --upgrade tinify

自动上传脚本

我自己简单写了个脚本,运行该脚本时需传入图片路径,当图片大于1MB大小时,上传Tinypng进行压缩。

# python 2.7
import tinify
import os
import sys tinify.key = "xxxxxxxxxxxxxxxx" # API Dashboard中的API Key class Tinify(): def __init__(self):
self.path = ' '.join(sys.argv[1:]) def get_fileSize(self, filePath):
fsize = os.path.getsize(filePath)
fsize = fsize / float(1024 * 1024)
print 'fileSize is %s' % round(fsize, 2)
return round(fsize, 2) def get_tinify(self):
file_list = os.listdir(self.path)
for f in file_list:
if f.endswith('png') or f.endswith('webp') or f.endswith('jpeg') or f.endswith('jpg'):
complete_path = self.path + '\\' + f
print complete_path
if self.get_fileSize(complete_path) > 1: # 图片大小超过1MB时,进行压缩
source = tinify.from_file(complete_path)
source.to_file(complete_path)
print "%s compress successful." % f if __name__ == '__main__':
a = Tinify()
a.get_tinify()

示例

原文件夹:

运行脚本

运行后

可以看到超过1MB的图片已经进行了压缩。

其他

官方文档的教学中,可以压缩后直接上传Amazon S3Google Cloud Storage, Gitee应该也是可以的,有时间了查看下源代码看看如何直接上传Gitee.

使用tinypng对需要上传Gitee图床的图片进行压缩的更多相关文章

  1. 帝国CMS7.2新增多图同时上传插件,上传多图效率更高

    原来上传多图文件,需要挨个选择文件,然后再点批量上传,比较麻烦.所以帝国CMS7.2新增了多图上传插件:为采用FLASH方式实现同时选择多个图片一起上传,提高多图上传效率. 帝国CMS多图上传插件特性 ...

  2. AF封装的关于一次请求上传多图到服务器!!!

    方式一:图片封装在模型数组中 /** *  上传多图到服务器 * *  @param URLString       请求地址 *  @param parameters      请求的其他参数 *  ...

  3. Typora笔记上传到播客时图片不显示问题解决(已解决)

    前言: ​ 相信我们都遇到过,使用Typora做笔记是一件非常令人舒服的事,然而,它却有一个非常难受的地方,那就是我们在做完笔记想要将其上传到自己的博客时,复制粘贴的图片无法显示.因为Typora复制 ...

  4. Typora使用Gitee图床

    前言 现在比较流行的Markdown编辑器应该是Typora,但是Typora本身不支持本地上传图片的云端存储,所以当我们写博客的时候,需要上传图片,就得自己设置图床,今天给大家推荐一款免费的图床-G ...

  5. 使用Typora+PicGo配置Gitee图床

    1.图床痛点 通常我们用 Typora 写 Markdown 文档,对于文档里面的图片,如果不使用图床,图片都是存放在本地,如果把文档复制到别的地方,还得额外复制图片,特别麻烦. 为了解决这种问题,一 ...

  6. 使用Typora+PicGo实现图片自动上传到Gitee图床

    一.前言 我们在使用Typora编辑器时,会加上图片,有个弊端,只能在本地访问,你发送给别人就无法查看图片,当然可以导出pdf.小编这边的需求是这样的,自己搭建的一个博客系统,基于Hexo搭建的,这个 ...

  7. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  8. input type=file实现图片上传,预览以及图片删除

    背景 前两天在做一个PC网站的意见反馈,其中涉及到了图片上传功能,要求可以上传多张图片,并且支持图片上传预览及图片删除, 图片上传这一块以前没怎么搞过,而且一般也很少会碰到这样的需求,所以在做这个功能 ...

  9. 用海豚框架(DolphinPHP)实现单/多图片上传时,如何获得图片路径

    用框架实现图片上传很简单,就不多说了,然后这个框架的实现机制是这样的,我们选择图片,点击上传,他会将图片保存在uploads下,以当天时间和随机字母作为图片名,然后在返回个数字,这个数字是这个图片的i ...

随机推荐

  1. ubuntu开机自启设置 Ubuntu16.04下测试OK

    在~/.config/autostart/目录下,添加xxx.desktop文件,内容如下: [Desktop Entry] Type=Application Name=start apps NoDi ...

  2. ES6中函数调用自身需要注意的问题

    在传统的递归调用中,可以采用如下方式 function sum(n) { return sum(n - 1) + n;} 但如今es6盛行,为了保持代码一致性,可以采用两种解决方式. 第一种,将thi ...

  3. mybatis动态sql以及分页

    1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...

  4. 板子题 Sol

    RT Cyber_Tree 出了一道板子题... 这题乍看之下貌似还不戳,但如果您做过类似的题,那么这就是一道板子题.... 首先明确要求的是什么,如果我们只考虑权值最大而不考虑最小距离,那么要求的显 ...

  5. jvm学习笔记:类加载过程

    类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息 ...

  6. openswan框架和编译时说明

    刚开始学习openswan项目代码时,自己尝试了在虚拟机上编译.安装.运行openswan代码,由于当时刚开始学习openswan代码,因此对于其构成并不清楚,在编译.运行过程中有了问题,基本是通过百 ...

  7. 第23篇-虚拟机对象操作指令之getstatic

    Java虚拟机规范中定义的对象操作相关的字节码指令如下表所示. 0xb2 getstatic 获取指定类的静态域,并将其值压入栈顶 0xb3 putstatic 为指定的类的静态域赋值 0xb4 ge ...

  8. 【C++周报】第一期2021-8-1

    [C++周报]第一期 2021-8-1 这一期我们来看这道题目:https://vijos.org/p/1058 这道题是一道非常好的模拟题.题目如下: 描述 我们用文本处理器来处理一个特殊的文本文件 ...

  9. 【Python学习】1.数据类型

    一.整数 可以使用十进制和十六进制来表示整数.比如:-1000和0x1e3f2d 二.浮点数 直接表示浮点数,比如:2.443或者1.2e5 1.2e-10等 整数和浮点数在计算机内部存储的方式是不同 ...

  10. Java跨平台原理(字节码文件,虚拟机)

    介绍 C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机 ...