注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

Python 指定フォルダ先のPNG→JPEG変換を自動化する方法

  • 2020年11月19日
  • 2020年11月20日
  • Python

ここでは「Python」をコマンドプロンプト環境下で使用し、指定フォルダ先のPNGファイルをJPEGファイルに変換する方法を紹介します。

 

PNG→JPEG変換プログラムの作成経緯は

拡張子を確認せず保存した大量の「PNGファイル」を、ブログ用として「JPEGファイル」に変換したい

からです。

このようなうっかりミスをしても、プログラムを使えば一瞬でJPEGファイルに変換することができますよね!

したがって、PNG→JPEG変換プログラムをつくることにしました。

 

この記事を読むことで

pythonを使ったPNGJPEG変換方法

フォルダの作成、パスの移動

フォルダサイズ(バイト)の取得

などを学ぶことができます。

 

Pythonプログラムの一連の流れは

・パスがフォルダかどうかの判別

・指定フォルダの中身を取得

・新規作成したフォルダへコピー

・コピーしたPNG→JPEGへ変換

・変換前後のフォルダサイズを表示

と実行されます。

 

実際の動作はこんな感じです。

convert-movie-0

少し見にくいと思いますが、

指定フォルダのPNGを読み取り、新しく作成したフォルダにJPEGを書き出す

ことがわかりますね。

 

taku
たくさんあるPNGファイルを一括、自動でJPEGに変換したい

という方にオススメな方法なので、是非挑戦してみてください。

 

前置きはここまでにして、早速始めていきましょう。

 

Pythonを始める前の準備

まずはPNG→JPEG変換プログラムをPythonで書く前に、動作環境の構築・ディレクトリ構造の変化などを確認しておきましょう。

 

Pythonの動作環境

今回実行を行った動作環境は以下の通りです。

OS:Windows10

テキストエディター:TeraPad(Visual Studioもたまに)

Pythonバージョン:3.7.5

 

2020/11/19日現在の最新バージョンは「Python:3.9.0」ですが、3系バージョンなら大抵は動作します。

Pythonのバージョン確認はコマンドラインで

python –version

python -V

などで確認することができます。

 

必要なpip install

今回のPNG→JPEG変換プログラムで必要なpip installは以下の1つになります。

 

pip install Pillow

Pillowは画像の切り抜き、リサイズ、編集を行うことができるライブラリになります。

 

他にも「インポート」として「os」、「sys」、「shutil」を呼び出しますが、標準ライブラリに含まれているので、追加でインストールする必要はありません。

 

プログラム実行時のディレクトリ構造

続いて、今回のプログラムで行われる動作内容をツリー型のディレクトリ構造で確認しておきます。

path-tree-format

上図は私が動作させたときのディレクトリ構造で、動作は次のように実行されます。

ディレクトリ構造と動作内容

①:ピンク枠の「picture」に変換したいPNGファイルとプログラムファイル.pyを用意する

 

②:プログラムを実行すると青枠の「picture_new」というファイルができる

 

③:プログラム実行中に青枠の「picture_new」にJPGファイルが作成される

 

ディレクトリ構造がわかっていると、Pythonプログラム内でのPath生成も理解しやすいと思うので、頭の片隅に入れておきましょう。

 

PNG→JPEG変換用の関数

それでは実際にプログラムを見ながら、それぞれの関数の動作を解説します。

 

Pythonでフォルダをチェックする

まずは、Pythonでフォルダをチェックする関数を見てみましょう。

import os
import sys
import shutil
from PIL import Image

path ='C:\code\picture'    # pathの指定
dir_name = 'picture_new'    # 新しいフォルダ名を定義
new_path = os.path.join(path, dir_name)    # 作成したフォルダのpathを作成

def folder_check(t_path):    # フォルダチェック
    if os.path.isdir(t_path):    # 指定したpathがフォルダか判定
        pass
    else:
        print("指定したpathはフォルダではないか、pathが正しくありません。")
        sys.exit()    # プログラムを終了

 

まずは

path = ‘ ※※※ ‘

でPNGファイルとPythonプログラムが入っているフォルダのPathを設定します。

※上記プログラムでは、「C:\code\picture」をpathとして指定しています。

 

続いて、JPEGファイルを保存するためのフォルダ名を

dir_name = ‘ ※※※ ‘

として決めます。

※こちらも任意のフォルダ名を設定しましょう。ここでは「picture_new」と指定。

 

JPEGファイル保存用のフォルダ名を決めたら

os.path.join(path, dir_name)

で指定したpathとdir_nameを結合し、JPEGファイル保存用のPathを取得しておきます。

 

ここで設定したPathを

os.path.isdir(t_path)

を使ってフォルダかどうかの判別を行います。

 

このPathがフォルダの場合は「True」を返すので、if文の中でpassを宣言してプログラムを続行させます。

もし指定したPathが

フォルダではない

Pathが正しくない

場合は「sys.exit()」を使用しプログラムを終了させています。

 

PythonでPNGファイルを選別する

続いて、指定したPathの中からPNGファイルを選別し、新しいフォルダへコピーを行う関数を説明します。

def png_check(t_path,n_path):
    dir_list = []  # フォルダ内のファイル格納用リスト
    dir_list = os.listdir(t_path)    # フォルダの中身を格納

    for i in range(len(dir_list)):
        try:
            file = Image.open('{}'.format(dir_list[i]))    # i番目のファイルを開く
            if file.format == 'PNG':    # 拡張子がPNGのとき
                png_path = os.path.join(t_path, dir_list[i])    # 対象ファイルのpathを取得
                shutil.copy(png_path, n_path)    # 対象ファイルを新しいフォルダへコピー
        except Exception:
            pass

 

引数にはPNGファイルとプログラムファイルが入っている「t_path」と、PNGファイルのコピー先である「n_path」を取ります。

dir_list = []

dir_list = os.listdir(t_path)

として「listdir」を使うと、指定したpathのファイル・フォルダの一覧を取得することができます。

取得した一覧は、dir_list[]の配列へ格納します。

 

続いて

file = Image.open(‘{}’.format(dir_list[i]))

で、取得したファイル・フォルダを一つずつ開いていきます。

 

開いていった中で

if file.format == ‘PNG’: # 拡張子がPNGのとき

png_path = os.path.join(t_path, dir_list[i]) # 対象ファイルのpathを取得

shutil.copy(png_path, n_path) # 対象ファイルを新しいフォルダへコピー

拡張子がPNGのファイルがあれば、対象ファイルのpathを取得して、新しいフォルダへコピーをします。

 

file.format

を使うことでfileの拡張子を取得することが可能です。

 

また

shutil.copy(対象のファイル・フォルダのpath ,  コピー先のpath)

と記述することでファイル・フォルダのコピーが可能になります。

 

PNGファイル以外の時は、「except>pass」を実行します。

 

PythonでPNG→JPEG変換をする

この関数が、PNG→JPEG変換プログラムで一番大事な関数になります。

def convert_jpeg(t_path):    # PNG→JPEG変換
    os.chdir(t_path)    # カレントディレクトリの移動
    new_list = []
    new_list = os.listdir(t_path)    # 新しいフォルダの中身を格納

    for i in range(len(new_list)):
        try:    # 新しいフォルダの中身は全てPNG
            file = Image.open('{}'.format(new_list[i]))
            file.convert('RGB').save(file.filename[:-4] + '.jpg')    # PNG→JPEG変換
            os.remove(new_list[i])    # 元のPNGファイルを削除
        except Exception:
            pass

まずは

os.chdir( t_path )

でカレントディレクトリを作成した新しいフォルダのpathへ移動します。

 

続いて、PNGファイルの選別を行ったときと同様に

new_list = []

new_list = os.listdir(t_path)

として新しく作成したフォルダのファイル・フォルダを取得します。

※なお新しく作成したフォルダの中身はPNGのコピー先として使用しているので、必ずPNGファイルしか存在しない状況です。

 

PNGファイルの情報を取得したら、「Image.open()」でPNGファイルを開き、JPEG変換を行っていきます。

file.convert(‘RGB’).save(file.filename[:-4] + ‘.jpg’) # PNG→JPEG変換

 

ここでポイントとなるのが「convert(‘RGB’)」です。

RGBモードに変換してから拡張子を変えないと

Traceback (most recent call last):
KeyError: ‘RGBA’Traceback (most recent call last):
File “※※.py”, line ※, in <module>
File “C:—\PIL\JpegImagePlugin.py”, line 616, in _save
raise OSError(“cannot write mode %s as JPEG” % im.mode) from e
OSError: cannot write mode RGBA as JPEG

とPNG→JPEG変換時にエラーが出力されます。

 

また、

.save(file.filename[:-4] + (‘.jpg’)

と記述することで

ファイル名の先頭から末尾-5番目までファイル名

を取得することができます。

これに 「.jpg」を加えることで拡張子をPNG→JPEGに変換して保存しています。

 

最後に、保存した状況で終了するとPNGファイル・JPGファイルの二つが存在することになるので、コピー元のPNGファイルを

os.remove(new_list[i])

と削除して終了です。

 

Pythonでフォルダサイズを算出する

こちらは「おまけ」程度ですが、PNG→JPEG変換前後のフォルダサイズを表示させます。

def folder_size(t_path):    # フォルダサイズの算出
    total_size = 0

    for file in os.listdir(t_path):
        total_size = total_size + os.path.getsize(os.path.join(t_path,file))
    return total_size

 

フォルダ・ファイルサイズの取得には

os.path.getsize( Path )

を使用します。

これをfor文を使って加算していくことでフォルダサイズの合計を算出しました。

 

実際に動かしてみると

png-convert-1

このようにPNG→JPEG変換前後のフォルダサイズを表示できることが確認できます。

 

PNG→JPEG変換プログラム全文

それでは最後にPNG→JPEG変換プログラムの全文を紹介して終わりにしたいと思います。

 

使用する際は

path = ‘※※※※※※※※’
dir_name = ‘※※※※※※※※’

を任意のpathとフォルダ名としてご利用ください。

※具体例は上記関数の解説を参照。

 

png_convert.py

import os
import sys
import shutil
from PIL import Image

path ='※※※※※※※※'    # 任意のpathを指定
dir_name = '※※※※※※※※'    # 任意の新しいフォルダ名を定義
new_path = os.path.join(path, dir_name)    # 作成したフォルダのpathを作成

def folder_check(t_path):    # フォルダチェック
    if os.path.isdir(t_path):    # 指定したpathがフォルダか判定
        pass
    else:
        print("指定したpathはフォルダではないか、pathが正しくありません。")
        sys.exit()    # プログラムを終了

def png_check(t_path,n_path):
    dir_list = []  # フォルダ内のファイル格納用リスト
    dir_list = os.listdir(t_path)    # フォルダの中身を格納

    for i in range(len(dir_list)):
        try:
            file = Image.open('{}'.format(dir_list[i]))    # i番目のファイルを開く
            if file.format == 'PNG':    # 拡張子がPNGのとき
                png_path = os.path.join(t_path, dir_list[i])    # 対象ファイルのpathを取得
                shutil.copy(png_path, n_path)    # 対象ファイルを新しいフォルダへコピー
        except Exception:
            pass

def convert_jpeg(t_path):    # PNG→JPEG変換
    os.chdir(t_path)    # カレントディレクトリの移動
    new_list = []
    new_list = os.listdir(t_path)    # 新しいフォルダの中身を格納

    for i in range(len(new_list)):
        try:    # 新しいフォルダの中身は全てPNG
            file = Image.open('{}'.format(new_list[i]))
            file.convert('RGB').save(file.filename[:-4] + '.jpg')    # PNG→JPEG変換
            os.remove(new_list[i])    # 元のPNGファイルを削除
        except Exception:
            pass

def folder_size(t_path):    # フォルダサイズの算出
    total_size = 0

    for file in os.listdir(t_path):
        total_size = total_size + os.path.getsize(os.path.join(t_path,file))
    return total_size

if __name__ == '__main__':

    folder_check(path)

    os.makedirs(new_path, exist_ok=True)    # dir_name のフォルダを作成

    print("現在のフォルダサイズ:{} バイト".format(folder_size(path)))

    png_check(path,new_path)

    convert_jpeg(new_path)

    print("convert後のフォルダサイズ:{} バイト".format(folder_size(path) + folder_size(new_path)))

    print("\n" + "プログラムを終了します。")
    sys.exit()

 

 

参考にしたサイト

note.nkmk.me Pythonの画像処理ライブライPillow(PIL)の使い方 など「note.nkmk.me」様のサイト

 

エンジニアがいるIT相談窓口・大阪

 

書籍:退屈なことはPythonにやらせよう-ノンプログラマーにもできる自動化処理プログラミング

 

 

また当サイトでは、IBM Watsonを使ったPythonによる「画像分析」として

[Graspy:AI初心者向け講座感想]IBM Watsonを使った画像分析・Python

といった記事や

Python自然言語処理とnewspaper3kで記事分析をしてみる

といったニュース記事分析を紹介しているので、興味があれば是非ご覧ください。

 

お疲れ様でした。

png_convert-top-0
学びに関する情報をチェック!