Python으로 이미지 압축 및 웹p 이미지 생성

6184 단어 WebPPython

거치다


사이트를 만드는 과정에서 이미지를 압축하고 웹 이미지를 만들 때
  • gulp에서 환경 만들기 및 실행

  • 구글 변환 도구를 사용하여 webp 이미지 생성
  • 의 순서로 작업이 진행되었습니다.
    소규모 사이트였으면 좋겠지만 대규모 사이트와 환경이 있어도 공유할 수 없는 상황 등을 고려해 도구를 만들어 봤다.

    개발 환경

  • Windows10
  • Python 3.9.5
  • 목표

  • 여러 JPG, PNG 이미지 압축
  • 여러 JPG, PNG 이미지에서 Webp 이미지 생성
  • 엔지니어 이외의 환경을 구축할 수 없는 사람도 작업을 할 수 있다
  • 3을 고려할 때 웹 브라우저에서 실행될지 GUI를 만들어 응용 프로그램으로 사용할지 고민이다
    이번에는 Python을 배우고 있기 때문에 데스크톱에서 사용할 수 있는 프로그램을 만들어야 합니다.

    최종 품목

    /dist/image_controller.exe 최종 품목
  • 압축, 변환할 이미지를 경로에 저장할 디렉터리 지정
  • 웹 이미지로 변환하려면 복선상자 확인
  • 사용할 라이브러리


  • Pillow
  • 사이즈 조정, 압축 등 이미지 처리

  • PySimpleGUI
  • GUI의 손쉬운 구현
  • glob
  • Python 설치 시 기본 설치
  • os
  • Python 설치 시 기본 설치
  • 사전 준비

    $ pip install Pillow
    $ pip install pysimplegui
    

    실시


    원하는 라이브러리 가져오기

    # 画像圧縮のライブラリをImportする
    from PIL import Image, ImageFilter
    
    # ファイルを取得するためのライブラリをImportする
    import glob
    import os
    
    #GUI生成するライブラリをImportする
    import PySimpleGUI as sg
    

    이미지 소스 압축

    # 圧縮のクオリティ
    quality = 70
    
    # 画像が格納されているディレクトリを指定する
    path = 'path/to/dir'
    files = glob.glob(path + '/*')
    
    # ディレクトリ内の画像をループで処理する
    for file in files :
      # 画像の情報を取得
      image = Image.open(file)
    
      # 画像を圧縮してセーブする
      image.save(path  + '/' + os.path.split(file)[1], optimize=True, quality=quality)
    

    웹 이미지로 JPG, PNG 저장

    # 画像が格納されているディレクトリを指定する
    path = 'path/to/dir'
    files = glob.glob(path + '/*')
    
    # ディレクトリ内の画像をループで処理する
    for file in files :
      image.save(path + '/' + os.path.split(file)[1].split('.')[0] + '.webp', 'webp')
    
    이로써 압축, 웹 이미지 생성을 진행할 수 있다

    GUI 구현

    # GUIのテーマを選択する
    sg.theme('Reddit')
    
    # GUIに必要な要素を配列で格納する
    layout = [
                [sg.Text('  パス'), sg.InputText(key='path', size=(40,8))],
                [sg.Text('webp画像を生成する'), sg.Checkbox('',key='is_webp', default=False)],
                [sg.Text('実行結果'),sg.MLine(key='output'+sg.WRITE_ONLY_KEY, size=(40,8))],
                [sg.Button('実行')]
              ]
    
    # Windowを生成する
    window = sg.Window(title='Image controller', layout=layout)
    
    # Window内の処理を記載する
    while True:
        event, values = window.read()
    
        # Windowが閉じられたときの処理
        if event == sg.WINDOW_CLOSED or event == 'Quit':
            break
    
        # ここに実行をクリックしたときの処理を記載する
        # syori();
    
    GUI를 설치했을 뿐입니다. Python 파일을 실행하면 최종 품목과 같은 외관의 GUI가 있습니다.

    파이썬 파일로 결합

    # ------------------------------ Settings ------------------------------ #
    
    # 画像圧縮のライブラリ
    from PIL import Image, ImageFilter
    
    # ファイルを取得するためのライブラリ
    import glob
    import os
    
    #GUI
    import PySimpleGUI as sg
    
    # ------------------------------ Config ------------------------------ #
    
    # 圧縮のクオリティ
    quality = 70
    
    # GUI
    sg.theme('Reddit')
    
    layout = [
                [sg.Text('  パス'), sg.InputText(key='path', size=(40,8))],
                [sg.Text('webp画像を生成する'), sg.Checkbox('',key='is_webp', default=False)],
                [sg.Text('実行結果'),sg.MLine(key='output'+sg.WRITE_ONLY_KEY, size=(40,8))],
                [sg.Button('実行')]
              ]
    window = sg.Window(title='Image controller', layout=layout)
    
    # テーマの確認
    # sg.preview_all_look_and_feel_themes()
    
    # ------------------------------ 画像圧縮の処理 ------------------------------ #
    
    def compression(file) :
      # 画像の情報を取得
      # フォーマット image.format
      # サイズ image.size
      # カラーモード image.mode
      image = Image.open(file)
    
      # 画像を圧縮してセーブする (values['path']でGUIで入力したパスが取得できる)
      image.save(values['path'] + '/' + os.path.split(file)[1],optimize=True,quality=quality)
    
      # メッセージをGUIに表示する
      window['output'+sg.WRITE_ONLY_KEY].print(os.path.split(file)[1] + ' is compressed.')
    
    def initalizeWebp(file) :
      image = Image.open(file)
    
      # webpに変換してセーブする  (values['path']でGUIで入力したパスが取得できる)
      image.save(values['path'] + '/' + os.path.split(file)[1].split('.')[0] + '.webp', 'webp')
    
      # メッセージをGUIに表示する
      window['output'+sg.WRITE_ONLY_KEY].print(os.path.split(file)[1] + ' is initalize webp image.')
    
    # ------------------------------ GUIの処理 ------------------------------ #
    
    # Windowの処理
    while True:
        event, values = window.read()
    
        # See if user wants to quit or window was closed
        if event == sg.WINDOW_CLOSED or event == 'Quit':
            break
    
        files = glob.glob(values['path'] + '/*')
    
        for file in files :
          compression(file)
    
          # チェックボックスがチェックされていたら実行
          if (values['is_webp'] == True) :
            initalizeWebp(file)
    

    웹 페이지 정보


    https://note.com/kohaku935/n/n721e5e620839
    https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59
    PysimpleGUI의 공식 문서는 통속적이고 알기 쉽게 쓰여 참고할 만하다.
    https://pysimplegui.readthedocs.io/en/latest/

    지원


    Python 파일의 exe화는 다음과 같은 도구를 사용합니다.
  • pyinstaller
  • 아래 사이트를 참고했습니다.
    https://techacademy.jp/magazine/18963
    가져오기에서 실행까지 간단하기 때문에 추천합니다.

    좋은 웹페이지 즐겨찾기