用python实现了一个图片尺寸不变但大小压缩的脚本

背景

我走到哪里总喜欢拍一些风景什么的,由于拍出来的照片都在好几兆,直接放在博客上供大家访问长此以往虚拟主机的流量消耗
会上去,另外页面加载的速度也比较缓慢,所以就想到了压缩照片,试过一些在线工具,压缩完取回本地实在太慢,也试过调tinypng
的接口来压缩,可是tinypng的速度比在线的还要慢就放弃了。

环境

  • Linuxmint 19.2
  • Python 3.6.8
  • Opencv 4.1.1.26

参考

依赖

1
sudo pip3 install opencv-python==4.1.1.26

使用说明

1
2
3
4
5
6
7
8
9
10
11
usage: images_compressing.py [-h] [-d DIRNAME] [-g GALLERYNAME]

Compress the images and then print gallery statements

optional arguments:
-h, --help show this help message and exit
-d DIRNAME, --dirname DIRNAME
the directory name including the images you want to
compress
-g GALLERYNAME, --galleryname GALLERYNAME
the gallery name including the images you want to post

这里主要说一下第二个参数-g,这个参数比如说在我的博客部署环境下是指在source/img/gallery文件夹下面再创建的文件夹,
最终主要用来输出gallery的声明用的,如下:

1
2
{% gallery /img/gallery/huawei_xicun/1.jpg 华为溪村 %}
{% gallery /img/gallery/huawei_xicun/2.jpg 华为溪村 %}

gallery和1.jpg之间的部分就是这个参数生成的。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os
import cv2
import argparse

def compress(dirname):
for filename in os.listdir(dirname):
img=cv2.imread(dirname+'/'+filename,1)
cv2.imwrite(dirname+'/'+filename,img,[cv2.IMWRITE_JPEG_QUALITY,20])

def print_gallery_statements(dirname, gallery_name):
for filename in os.listdir(dirname):
print("{{% gallery /img/gallery/{}/{} {} %}}".format(gallery_name,filename,dirname))

if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Compress the images and then print gallery statements')

parser.add_argument(
'-d', '--dirname',
type=str,
help="the directory name including the images you want to compress")
parser.add_argument(
'-g', '--galleryname',
type=str,
help="the gallery name including the images you want to post")

args = parser.parse_args()
compress(args.dirname)
print_gallery_statements(args.dirname, args.galleryname)

压缩效果

写在最后

  • 如果想支持命令行更改图片压缩质量的功能或其它功能,欢迎给我发邮件到sharp.gan1993@gmail.com付费定制哦~
Author: Sharp
Link: http://sharpgan.com/2019/10/23/python-images-compressing/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
支付宝打赏
微信打赏