webp.py

1.4 kB · python · 41 lines

1import os2import sys3from concurrent.futures import ProcessPoolExecutor45from PIL import Image67HERE = os.path.dirname(os.path.abspath(__file__))8FIGURES = os.path.join(HERE, "..", "files", "figures")9WIDTH = 102410QUALITY = 9011METHOD = 61213def press(png):14    webp = png[:-4] + ".webp"15    fresh = os.path.exists(webp) and os.path.getmtime(webp) >= os.path.getmtime(png)16    if not fresh:17        image = Image.open(png)18        if image.width > WIDTH:19            image = image.resize((WIDTH, round(image.height * WIDTH / image.width)), Image.LANCZOS)20        image.save(webp, "WEBP", quality=QUALITY, method=METHOD)21    return os.path.getsize(png), os.path.getsize(webp), fresh, os.path.basename(webp)2223def main():24    home = os.path.normpath(FIGURES)25    names = sorted(name for name in os.listdir(home) if name.endswith(".png"))26    if not names:27        print("no figures in files/figures")28        return 029    with ProcessPoolExecutor() as pool:30        rows = list(pool.map(press, [os.path.join(home, name) for name in names]))31    png = sum(row[0] for row in rows)32    webp = sum(row[1] for row in rows)33    kept = sum(1 for row in rows if row[2])34    big = max(rows, key=lambda row: row[1])35    mb = lambda n: f"{n / 1048576:.1f} MB"36    print(f"{len(rows)} webp ({len(rows) - kept} pressed) {mb(webp)} from {mb(png)} of png, {webp / png:.0%}")37    print(f"largest {big[3]} {big[1] / 1024:.0f} KB")38    return 03940if __name__ == "__main__":41    sys.exit(main())