【第37回PYTHON講座】画像をまとめてWebpに変換するプログラム作成

PYTHON

みなさん、こんにちは。
複数の画像ファイルをWebp形式像に一括変換するプログラムを作成しようと思います。

プログラムを作成に至った経緯

Googleが推奨するWebp形式の画像は、品質を落とさずPNGよりも画像サイズを抑えられることが出来ます。

画像サイズを落とすことによって、ページを開く時間を縮小することが出来ます。

そのWebp形式の画像ですが、スマホ、デジカメ、スクリーンショットの保存形式では対応していません。

その為、Webp形式に変換をする必要があります。

画像編集ソフトではWebpに保存することが出来ますが、数が多くなると一つ一つ変換しないといけないので面倒ですよね。

そこで、PythonでWebp形式に一括で変換できないかと思い、今回のプログラムを作成することにしました。

前回のプログラムを少しだけ書き換えるだけで出来ますので、前回の記事をご覧になられていない方は下記をチェックして下さい。

プログラムの内容

作成するプログラムの内容は以下の通りです。

  • フォルダ内の画像(JPG、PNG)を一括処理
  • 処理した画像は別のフォルダに移動させる
  • 処理した元画像は別のフォルダに移動させる
  • Webpの画質を95%にする

 フォルダ内の画像を一括処理します。

今回は、フォルダ内の画像形式はJPG、PNGだけという想定にします。

 処理した画像は別のフォルダに移動させます。

 処理した元画像は別のフォルダに移動させます。

 画質を落したくないので、画質を95%にします。

使用するライブラリ PIL(pillow)、os、shutil

今回使用するライブラリは「画像処理ライブラリPIL(pillow)」になります。

インストールされていない方は、下記のコマンドでインストールして下さい。

pip install pillow

os」、「shutil」はpythonの標準ライブラリなのでインストールする必要はありません。フォルダ内のファイル取得、ファイル移動の際に使用します。

プログラムコード

では、プログラムコードの説明に入りたいと思います。

iimport os
from PIL import Image
import shutil

folder_a ='C:/Labo/webp-buffer/'
folder_b ='C:/Labo/webp/'
folder_c ='C:/Labo/webp-original/'

list1=[]

for i in os.listdir(folder_a):
    if os.path.isfile(folder_a + i):
        list1.append(i)

for i in range(len(list1)):
    imagefile = os.path.join(folder_a, list1[i])
    imagedata = Image.open(imagefile)
    newimage = folder_b + list1[i][:-4] + ".webp"
    print(newimage)
    imagedata.save(newimage, quality=95, optimize=True)
    shutil.move(imagefile, folder_c)
1、2、3行目 ライブラリのインポート
iimport os
from PIL import Image
import shutil

PIL(pillow)からImageをインポートします。

5行目 フォルダの定義
folder_a ='C:/Labo/webp-buffer/'
folder_b ='C:/Labo/webp/'
folder_c ='C:/Labo/webp-original/'
  • folder_a : webpに変換される前のオリジナル画像のフォルダ
  • folder_b : webpに変換された画像のフォルダ
  • folder_c : webpに変換された後にオリジナル画像をこのフォルダに移動させます
9~13行目 フォルダ内の画像のリスト化
list1=[]

for i in os.listdir(folder_a):
    if os.path.isfile(folder_a + i):
        list1.append(i)

フォルダ「folder_a」にあるファイルをリスト「list1」に格納していきます。

「os.path.isfile(ファイル名)」でファイルの有無を確認します。

通常、os.listdir(フォルダ名)は、フォルダ内のファイルとフォルダをリスト化するので、ファイルのみをリスト化する為に、「os.path.isfile(ファイル名)」を条件に入れています。

15~17行目 フォルダ内の画像を開く
for i in range(len(list1)):
    imagefile = os.path.join(folder_a, list1[i])
    imagedata = Image.open(imagefile)

フォルダ内の画像を開いていきます。

画像を開くためには絶対パスの付いた名前で開かないといけないので、「os.path.join」を使っています。

18、19行目 webp画像のファイル名
    newimage = folder_b + list1[i][:-4] + ".webp"
    print(newimage)

ファイル名が同じなので拡張子を「webp」に変えます。

list1[i][:-4]で、ファイル名の右から4文字目までを削除します。

例えば、「C:\Labo\webp-buffer\test.png」であれば、「C:\Labo\webp-buffer\test」となり、.webpを付け加えることで、「C:\Labo\webp-buffer\test.webp」になります。

20行目 webpとして保存
imagedata.save(newimage, quality=95, optimize=True)

ファイル名の拡張子をwebpにするだけで、webp形式に保存されます。

qualityは保存する品質になります。数字が高いほど、粗さは無くなります(最大:100)。

optimizeは不要な色を削除するという最適化するオプションになります。ファイルサイズとしてはわずかに縮小するので、optimizeはTrueにして下さい。

21行目 オリジナル画像の移動
shutil.move(imagefile, folder_c)

最後にオリジナル画像を移動させます。

ファイルの移動は「shutil.move(ファイル名, フォルダ名)」を使用します。

以上で完成です。

まとめ

いかがだったでしょうか。

変換プログラムを走らせるとすぐに変換されるので、すごく便利です。やはり一度に複数の画像が変換できるのはいいですよね。

是非、みなさんも参考にして下さいね。

役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました