图片压缩

为了在网络间高效传播图片,需要将图片进行压缩,所以找到网站 TinyPNG,但是单文件最大 5 MB。之后从网络上查找资料,发现 FFmpeg 可以做到类似的事情,但是由于时间较老,具体的来源已不可考。

tinypng.py
 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
30
31
32
33
34
35
36
import os
import shutil
import subprocess
import tempfile


def tinypng(input_path: str, output_path: str) -> bool:
    '''
    - Argument:
        - input_path: 输入路径
        - output_path: 输出路径
    '''
    if not os.path.exists(input_path):
        return False
    with tempfile.NamedTemporaryFile(
        suffix=os.path.splitext(input_path)[-1], delete=False
    ) as f:
        for command in (
            (
                'ffmpeg', '-i', input_path,
                '-vf', 'palettegen=max_colors=256:stats_mode=single',
                '-y', f.name,
            ), (
                'ffmpeg', '-i', input_path, '-i', f.name,
                '-lavfi', '[0][1:v] paletteuse', '-pix_fmt', 'pal8',
                '-y', output_path,
            )
        ):
            subprocess.run(command)
    os.unlink(f.name)
    if os.path.exists(output_path):
        if os.path.getsize(output_path) > os.path.getsize(input_path):
            shutil.copy(input_path, output_path)  # 未起到压缩目的
    else:
        shutil.copy(input_path, output_path)  # 压缩失败
    return True