动漫av纯肉无码国产av-动漫av永久无码精品每日更新-动漫av专区-动漫h精品无码一区二区三区-动漫成人-动漫成人无码精品一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

python命令行工具 圖片png轉(zhuǎn)webp

freeflydom
2025年2月2日 14:53 本文熱度 91

前言

網(wǎng)頁上使用webp格式的圖片更加省網(wǎng)絡(luò)流量和存儲空間,但本地圖片一般是png格式的,所以考慮用python的pillow庫將png格式的圖片轉(zhuǎn)換為webp格式。

需求:

  • 可以在系統(tǒng)任意地方調(diào)用。這需要編譯成二進制程序或?qū)懗赡_本放到PATH環(huán)境變量下
  • 支持指定圖片文件輸入目錄。默認(rèn)為當(dāng)前目錄。
  • 支持指定圖片文件輸出目錄。默認(rèn)為輸入文件的同級目錄。
  • 支持指定圖片壓縮質(zhì)量。默認(rèn)為80。需要校驗傳參。
  • 支持并發(fā)同時壓縮多個圖片文件。默認(rèn)為串行。傳參的并發(fā)數(shù)最大為CPU核心數(shù)。

代碼

from PIL import Image
import argparse
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
import os
from time import time
def parse_args():
    """解析命令行參數(shù)"""
    parser = argparse.ArgumentParser(description="Convert PNG to WEBP", 
        usage="""
        # 直接執(zhí)行, 默認(rèn)轉(zhuǎn)換當(dāng)前目錄下的所有png文件到同級目錄
        python main.py
        # 將轉(zhuǎn)換后的webp文件保存到output目錄下
        python main.py -o output
        # 轉(zhuǎn)換單個png文件, 單獨轉(zhuǎn)換時不支持指定輸出目錄
        python main.py -f 1.png
        # 同時轉(zhuǎn)換, -t 指定最大并發(fā)數(shù), 默認(rèn)為1, 最大不得超過CPU核心數(shù)
        python main.py -t 2
        # 指定圖片壓縮質(zhì)量, 默認(rèn)為80, 取值區(qū)間為[0, 100], 值越高, 質(zhì)量越好, 生成圖片體積越大
        python main.py -q 75
        """)
    parser.add_argument(
        "-i", type=str, default=os.getcwd(), help="Path to the input PNG image"
    )
    parser.add_argument(
        "-o", type=str, default=os.getcwd(), help="Path to the output WEBP image"
    )
    parser.add_argument("-f", type=str, default="", help="specific file name")
    parser.add_argument("-t", type=int, default=1, help="Number of threads to use")
    parser.add_argument(
        "-q", type=int, default=80, help="Quality of the output WEBP image"
    )
    return parser.parse_args()
def convert_png_to_webp(input_path: Path, output_path: Path, quality=80) -> None:
    """
    轉(zhuǎn)換PNG為WEBP
    Args:
        input_path (Path): 輸入文件路徑
        output_path (Path): 輸出文件路徑, 可以是一個目錄, 也可以是一個webp文件的路徑
        quality (int, optional): 圖片壓縮質(zhì)量. 默認(rèn)為 80.
    """
    # 如果quality不在0到100之間, 則設(shè)置為80
    if quality > 100 or quality < 0:
        print("quality must be between 0 and 100, now set to 80")
    real_q = quality if quality <= 100 and quality > 0 else 80
    # 如果輸入文件不存在, 則打印錯誤信息并返回
    if not input_path.exists():
        print(f"input file {input_path} not found")
        return
    # 如果指定了輸出目錄, 則嘗試創(chuàng)建輸出目錄
    if not output_path.exists() and output_path.suffix.lower() != ".webp":
        try:
            output_path.mkdir(parents=True)
        except Exception as e:
            print(e)
            print("Failed to create output directory")
            return
    # 如果指定了輸出目錄, 則修改輸出文件名為為輸入文件名, 并修改擴展名為.webp
    if output_path.suffix.lower() != ".webp":
        output_path = output_path / input_path.with_suffix(".webp").name
    start = time()
    try:
        with Image.open(input_path) as img:
            print(
                f"Converting {input_path}, quality={real_q}, size: {input_path.stat().st_size / 1024:.2f}KB"
            )
            img.save(output_path, "WEBP", quality=real_q)
            print(
                f"Convert png2webp successfully, output file: {output_path.name}, size: {int(output_path.stat().st_size) / 1024:.2f}KB, elapsed time: {time() - start:.2f}s"
            )
    except Exception as e:
        print(f"Convert png2webp failed: {e}")
def multi_thread_convert(max_workers: int, input_path, output_path, quality) -> None:
    """并發(fā)轉(zhuǎn)換png為webp"""
    print(f"convert png to webp with multi threads, max_workers: {max_workers}")
    p = Path(input_path)
    op = Path(output_path) if output_path != os.getcwd() else None
    max_workers = max_workers if max_workers < os.cpu_count() else os.cpu_count()
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        for f in p.glob("**/*.png"):
            executor.submit(
                convert_png_to_webp, f, op or f.with_suffix(".webp"), quality
            )
def main():
    start = time()
    args = parse_args()
    if not args.f:
        if args.t > 1:
            multi_thread_convert(args.t, args.i, args.o, args.q)
        else:
            p = Path(args.i)
            op = Path(args.o) if args.o != os.getcwd() else None
            for f in p.glob("**/*.png"):
                convert_png_to_webp(f, op or f.with_suffix(".webp"), args.q)
    else:
        p = Path(args.f)
        convert_png_to_webp(p, p.with_suffix(".webp"), args.q)
    print(f"Finished! Total elapsed time: {time() - start:.2f}s")
if __name__ == "__main__":
    main()

編譯

因為是在python虛擬環(huán)境中安裝的pillow,如果要在其它位置調(diào)用這個腳本,個人想了兩種方式:

  1. 另外編寫一個shell腳本,如果是windows,則編寫powershell腳本,在這個腳本內(nèi)編寫調(diào)用邏輯,并把這個腳本放到PATH環(huán)境變量的路徑下。
  2. 編譯成二進制文件,將編譯好的二進制文件放到PATH環(huán)境變量下。這比較方便發(fā)送給別人,這樣別人就不需要在電腦上安裝python環(huán)境。

這里用pyinstaller將程序編譯成二進制文件,盡量在python虛擬環(huán)境下編譯,以減小二進制文件的體積

  1. 創(chuàng)建虛擬環(huán)境
python -m venv png2webp
  1. 激活虛擬環(huán)境
# linux
cd png2webp
source ./bin/activate
# windows powershell
cd png2webp
.\Scripts\activate
  1. 安裝依賴
python -m pip install pillow pyinstaller
  1. 編譯。注意修改實際的python文件路徑。
pyinstaller -F --clean .\main.py
  1. 生成的二進制文件在當(dāng)前目錄下的dist目錄,將其放置到PATH環(huán)境變量下,如有需要可重命名。
  2. 測試在其他目錄下調(diào)用
png2webp --help

使用

# 直接執(zhí)行, 默認(rèn)轉(zhuǎn)換當(dāng)前目錄下的所有png文件到同級目錄
png2webp
# 將轉(zhuǎn)換后的webp文件保存到output目錄下
png2webp -o output
# 轉(zhuǎn)換單個png文件, 單獨轉(zhuǎn)換時不支持指定輸出目錄
png2webp -f 1.png
# 同時轉(zhuǎn)換, -t 指定最大并發(fā)數(shù), 默認(rèn)為1, 最大不得超過CPU核心數(shù)
png2webp -t 2
# 指定圖片壓縮質(zhì)量, 默認(rèn)為80, 取值區(qū)間為[0, 100], 值越高, 質(zhì)量越好, 生成圖片體積越大
png2webp -q 75

該文章在 2025/2/5 9:34:56 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产人妻无码区免费九色 | 久久综合欧美亚洲第一页 | 精品久久中文字幕有码 | 国产免费成人在线视频 | 国产精品无码无卡毛片不卡视 | 美女网站免费福利视频 | 午夜一区二区免费视频 | 国产精品无卡无在线播放 | 国产精品人妻熟女a8198v久 | 国产福利电影一区二区三区久久精品这 | 人禽无码做爰在线观看 | 亚洲AV优女天堂波多野结衣 | 97人妻熟女成人免费视频 | 在线国产欧美专区 | 久久婷婷综合激情亚洲狠狠 | 麻豆精品在线观看 | 91香蕉视频免费 | 亚洲第一无码专区天堂 | 黑人超大巨茎 | 亚洲成av人影片在线观看 | 精品泰妻少妇嫩草av无码专区高清一区二区三区四区五区六区 | 日韩a人毛片精品无人区乱码 | 1区2区3区4区产品乱码不卡 | 国产亚洲精品久久7788 | 免费99精品国产自在现线 | 国产成人久久精品区一区二 | 久久精品国产免费看久久精品 | 国产精品久久午夜夜伦鲁鲁 | 精品人妻无码区二区三区 | 国语字幕在线播放字幕mv在线高清最 | 爱色av一区二区三区 | 日韩精品中文字幕在线观看 | 给我一个可以看片的免费 | 一本-道久久A久久精品综合 | 日本高清免费在线视频 | 色婷婷| 日本人视频超级大导航 | 91嫩草国产在线观看免费 | 在线播放无码真实一线天 | 99久久亚洲精品日本无码 | 91久久伊人精品影院 |