亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python實(shí)現(xiàn)png轉(zhuǎn)webp的命令行工具

 更新時(shí)間:2025年02月05日 08:20:43   作者:花酒鋤作田  
網(wǎng)頁(yè)上使用webp格式的圖片更加省網(wǎng)絡(luò)流量和存儲(chǔ)空間,但本地圖片一般是png格式的,所以本文就來(lái)為大家介紹一下如何使用Python實(shí)現(xiàn)png轉(zhuǎn)webp功能吧

前言

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

需求:

  • 可以在系統(tǒng)任意地方調(diào)用。這需要編譯成二進(jìn)制程序或?qū)懗赡_本放到PATH環(huán)境變量下
  • 支持指定圖片文件輸入目錄。默認(rèn)為當(dāng)前目錄。
  • 支持指定圖片文件輸出目錄。默認(rèn)為輸入文件的同級(jí)目錄。
  • 支持指定圖片壓縮質(zhì)量。默認(rèn)為80。需要校驗(yàn)傳參。
  • 支持并發(fā)同時(shí)壓縮多個(gè)圖片文件。默認(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文件到同級(jí)目錄
        python main.py

        # 將轉(zhuǎn)換后的webp文件保存到output目錄下
        python main.py -o output

        # 轉(zhuǎn)換單個(gè)png文件, 單獨(dú)轉(zhuǎn)換時(shí)不支持指定輸出目錄
        python main.py -f 1.png

        # 同時(shí)轉(zhuǎn)換, -t 指定最大并發(fā)數(shù), 默認(rèn)為1, 最大不得超過(guò)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): 輸出文件路徑, 可以是一個(gè)目錄, 也可以是一個(gè)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

    # 如果輸入文件不存在, 則打印錯(cuò)誤信息并返回
    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

    # 如果指定了輸出目錄, 則修改輸出文件名為為輸入文件名, 并修改擴(kuò)展名為.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()

編譯

因?yàn)槭窃趐ython虛擬環(huán)境中安裝的pillow,如果要在其它位置調(diào)用這個(gè)腳本,個(gè)人想了兩種方式:

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

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

1.創(chuàng)建虛擬環(huán)境

python -m venv png2webp

2.激活虛擬環(huán)境

# linux
cd png2webp
source ./bin/activate

# windows powershell
cd png2webp
.\Scripts\activate

3.安裝依賴

python -m pip install pillow pyinstaller

4.編譯。注意修改實(shí)際的python文件路徑。

pyinstaller -F --clean .\main.py

5.生成的二進(jìn)制文件在當(dāng)前目錄下的dist目錄,將其放置到PATH環(huán)境變量下,如有需要可重命名。

6.測(cè)試在其他目錄下調(diào)用

png2webp --help

使用

# 直接執(zhí)行, 默認(rèn)轉(zhuǎn)換當(dāng)前目錄下的所有png文件到同級(jí)目錄
png2webp

# 將轉(zhuǎn)換后的webp文件保存到output目錄下
png2webp -o output

# 轉(zhuǎn)換單個(gè)png文件, 單獨(dú)轉(zhuǎn)換時(shí)不支持指定輸出目錄
png2webp -f 1.png

# 同時(shí)轉(zhuǎn)換, -t 指定最大并發(fā)數(shù), 默認(rèn)為1, 最大不得超過(guò)CPU核心數(shù)
png2webp -t 2

# 指定圖片壓縮質(zhì)量, 默認(rèn)為80, 取值區(qū)間為[0, 100], 值越高, 質(zhì)量越好, 生成圖片體積越大
png2webp -q 75

到此這篇關(guān)于基于Python實(shí)現(xiàn)png轉(zhuǎn)webp的命令行工具 的文章就介紹到這了,更多相關(guān)Python png轉(zhuǎn)webp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中如何使用xml.dom.minidom模塊讀取解析xml文件

    python中如何使用xml.dom.minidom模塊讀取解析xml文件

    xml.dom.minidom模塊應(yīng)該是內(nèi)置模塊不用下載安裝,本文給大家介紹python中如何使用xml.dom.minidom模塊讀取解析xml文件,感興趣的朋友一起看看吧
    2023-10-10
  • Python django框架應(yīng)用中實(shí)現(xiàn)獲取訪問(wèn)者ip地址示例

    Python django框架應(yīng)用中實(shí)現(xiàn)獲取訪問(wèn)者ip地址示例

    這篇文章主要介紹了Python django框架應(yīng)用中實(shí)現(xiàn)獲取訪問(wèn)者ip地址,涉及Python Request模塊相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2019-05-05
  • Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼

    Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼

    marshmallow(Object serialization and deserialization, lightweight and fluffy.)用于對(duì)對(duì)象進(jìn)行序列化和反序列化,并同步進(jìn)行數(shù)據(jù)驗(yàn)證。這篇文章主要介紹了Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼,需要的朋友可以參考下
    2020-02-02
  • 恢復(fù)百度云盤本地誤刪的文件腳本(簡(jiǎn)單方法)

    恢復(fù)百度云盤本地誤刪的文件腳本(簡(jiǎn)單方法)

    下面小編就為大家?guī)?lái)一篇恢復(fù)百度云盤本地誤刪的文件腳本(簡(jiǎn)單方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    在Python中,有許多庫(kù)可以用來(lái)壓縮PDF文件,其中最常用的是PyPDF2和PDFMiner,本文將為大家介紹一個(gè)新的方法,即使用緩存流壓縮PDF文件,感興趣的可以了解下
    2023-08-08
  • Android基于TCP和URL協(xié)議的網(wǎng)絡(luò)編程示例【附demo源碼下載】

    Android基于TCP和URL協(xié)議的網(wǎng)絡(luò)編程示例【附demo源碼下載】

    這篇文章主要介紹了Android基于TCP和URL協(xié)議的網(wǎng)絡(luò)編程,結(jié)合實(shí)例形式分析了Android網(wǎng)絡(luò)編程的通信原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2018-01-01
  • Python畫(huà)圖學(xué)習(xí)入門教程

    Python畫(huà)圖學(xué)習(xí)入門教程

    這篇文章主要介紹了Python畫(huà)圖的方法,結(jié)合實(shí)例形式分析了Python基本的線性圖、餅狀圖等繪制技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 基于Python制作一個(gè)文件解壓縮工具

    基于Python制作一個(gè)文件解壓縮工具

    經(jīng)常由于各種壓縮格式的不一樣用到文件的解壓縮時(shí)就需要下載不同的解壓縮工具去處理不同的文件。本文將用Python制作一個(gè)解壓縮小工具,以后再也不用下載各種格式的解壓縮軟件了
    2022-05-05
  • Python編程實(shí)現(xiàn)線性回歸和批量梯度下降法代碼實(shí)例

    Python編程實(shí)現(xiàn)線性回歸和批量梯度下降法代碼實(shí)例

    這篇文章主要介紹了Python編程實(shí)現(xiàn)線性回歸和批量梯度下降法代碼實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python完全卸載三種方法教程

    python完全卸載三種方法教程

    通常我們?cè)谛遁dpyhton時(shí)會(huì)直接使用電腦自備的管家軟件中的卸載功能,但是通常這并不會(huì)卸載干凈,特別是當(dāng)你卸載完python一個(gè)版本之后,重新安裝另一個(gè)版本就會(huì)出錯(cuò),這篇文章主要給大家介紹了關(guān)于python完全卸載三種方法的相關(guān)資料,需要的朋友可以參考下
    2023-09-09

最新評(píng)論