背景

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

环境

  • Linuxmint 19.2
  • Python 3.6.8
  • Opencv 4.1.1.26

参考

依赖

sudo pip3 install opencv-python==4.1.1.26

使用说明

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的声明用的,如下:

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

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

代码

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)

压缩效果

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

写在最后

  • 如果想支持命令行更改图片压缩质量的功能或其它功能,欢迎给我发邮件到[email protected]付费定制哦~