「Python」PNG OR JPG Convert to WebP 原 薦

PNG/JPG Convert to Webp(Python)

前言

關於webp 的優勢以及原理性的東西,之前看過騰訊的一篇文章.WebP原理和Android支持現狀介紹

webp 圖片格式兼容到Android4.0,之前轉換webp的時候都是通過在線轉換器,不過效率是在是太慢了,單張還好,批量轉換就很痛苦了,故本人寫了一個python 腳本來實現自動化批量將png 或者 jpg 轉換爲webp

環境搭建

  • webp環境

    Mac 可以使用homebrew來安裝實用程序。

      brew install webp
    

    安裝實用程序完成後,就可以使用 cwebp命令 將 JPEG 或 PNG 圖像轉換成 webp 格式, 也可以通過dwebp 命令將 webp 圖像轉換回 PNG、PAM、PPM 或 PGM 圖像。

    示例

      cwebp [options] -q quality input.jpg -o output.webp  
    

    質量選項應該是 0 (差)到 100 (很好)之間的數字,典型的質量值大約是 80,也可以多嘗試幾個數值。本人一般轉圖片時質量用的是80

      dwebp input_file.webp [options] [-o output_file]
    
  • python 環境

    python現在已經很火了,網上關於python的環境搭建也有很多,Google下下了,如果想學習python的話,推薦廖雪峯老師的教程,還是比較容易懂的。廖雪峯老師Python

需求分析

瞭解了上面的cwebp命令,下面就用python對cwebp 進行一個簡單的封裝就好了。首先我希望quality是可配置的;另外我還希望有一個默認大小的配置,比如改文件夾下低於20kb的我希望用原圖,不將其轉換爲webp 下面直接貼代碼。大思路是這樣:首先去檢查參數,文件夾路徑等,默認輸出到原文件夾_webp下面,轉換完以後統一copy並刪除原文件

# encoding=utf-8

#  -s 最小要壓縮圖片大小 (kb)
#  -i 要壓縮的圖片文件夾目錄
#  -q 壓縮圖片質量  默認80

import commands
import os
import sys
import getopt
import shutil

input_file = "" 
quality = "80"

outputPath = input_file + "_webp"

compressSize = ""


def handle_sys_arguments():
    opts, args = getopt.getopt(sys.argv[1:], "hi:o:q:s:")
    global quality
    global output_file
    global compressSize
    global input_file

    for op, value in opts:
        # print("op:" + op + "__" + value)
        if op == "-i":
            input_file = value
        elif op == "-o":
            output_file = value
        elif op == "-h":
            print(" -s 最小要壓縮圖片大小 (kb)\n -i 要壓縮的圖片文件夾目錄\n -q 壓縮圖片質量  默認80")
            exit()
        elif op == "-q":
            quality = value
        elif op == "-s":
            compressSize = value


def path_file(path):
    for i in os.listdir(path):
        print(i)
        new_path = os.path.join(path, i)
        if os.path.isfile(new_path):
            transform(new_path)
        else:
            path_file(new_path)


def transform(f):
    split_name = os.path.splitext(f)
    filePath = f

    print(split_name[0])

    if split_name[1] == ".webp" or (split_name[1] != ".jpg" and split_name[1] != ".png"):
        return

    if compressSize.strip() != "" and os.path.getsize(filePath) / 1024.0 > int(compressSize):
        command = "cwebp -q " + quality + " " + filePath + " -o " + \
                  split_name[0] + ".webp"
        commands.getstatusoutput(command)
        print("執行了:" + command)
    elif compressSize.strip() == "":
        command = "cwebp -q " + quality + " " + filePath + " -o " + \
                  split_name[0] + ".webp"
        commands.getstatusoutput(command)
        print("執行了:" + command)
    else:
        print("不壓縮")


def check_args():
    if input_file.strip() == "":
        print("請輸入要轉換的文件夾路徑")
        exit()


def copy_webp_files(sourceDir, targetDir):
    if not os.path.exists(targetDir):
        os.makedirs(targetDir)

    print sourceDir
    print(targetDir)

    for file in os.listdir(sourceDir):

        new_source_path = os.path.join(sourceDir, file)
        new_target_path = os.path.join(targetDir, file)

        # print("copyWebpFiles" + new_source_path)
        # print("copyWebpFiles_target" + new_target_path)

        if os.path.isdir(new_source_path):

            copy_webp_files(new_source_path, new_target_path)

        else:
            splite_name = os.path.splitext(file)
            print("copyWebpFiles_split" + splite_name[1])

            if splite_name[1] != ".webp":  # 只複製webp文件
                continue

            shutil.copy(new_source_path, new_target_path)
            os.remove(new_source_path)


if __name__ == '__main__':
    handle_sys_arguments()
    check_args()
    path_file(input_file)
    copy_webp_files(input_file, outputPath)

示例

我在桌面建立一個文件夾,裏面放了一些需要抓換的圖片,需要將這些圖片全部轉換爲webp,輸入命令

python /Users/work/Desktop/webp_converter.py  -i /Users/work/Desktop/img

Webp

WebP-Converter

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章