フォルダー内の「bmp」や「jpg」、「png」を一括で「webp」に変換する。
jpg(jpeg)やpngなど様々な画像の形式があり、
よく耳にするjpg、pngはどちらも使い勝手が良いです。
png形式の最大の特徴は背景を透明化できることです。
文字だけのロゴに適して透明な背景を持つことで、他の画像や背景と組み合わせることができます。
また、pngは非可逆圧縮を使用しているため、保存された画像は高品質が保たれます。
対して、jpgは背景を透明にすることはできませんが、可逆圧縮形式でpngとほぼ同様に鮮明な画像を保存することができます。
つまり、jpgの方がpngよりもファイルサイズは小さくできます。
png | 背景が透明、ロゴづくりに最適。ただし、ファイルは大きくなる。 |
jpg | ファイルは小さく、ウェブページに最適。ただし、背景は透明にできない。 |
画像をブログに載せることは、SEO観点で上位表示できて、
アドセンスに合格しやすいなど様々なメリットがあります。
「O-DAN (オーダン)」や「写真AC」等々画像は無料で商用利用ができて、加工も可能です。
※一部商用利用や加工が禁止されているものがあります。詳細は各サイトの規約や免責事項をお読みください。
だれでも使用しやすい分、似たような画像がネット上で散見するようになるので、
対策として加工をしましょう。
私は画像加工するには動画編集ソフトの「AvUtil」をおすすめしていますが、AvUtilの画像出力は「bmp」でjpgやpngと比べると非常にファイルサイズが大きくなってしまいます。
本記事では、ブログやウェブサイトに画像を載せる際は、「webP」を推奨しています。
WebPは、Googleが開発した画像形式で、「jpg」・「png」・「bmp」よりも高い圧縮率で、同じ画質であればファイルサイズが小さくなります。
要するに、ウェブサイトに載せる画像形式を「webP」にすると、
サイトへのアクセス時間が早くなり、ユーザー獲得につながります。
しかし、「webP」といっても、このフォーマットを知っている人は、
ブログをやっている人でも少ないと思います。
chatGPTで出力される画像はwebp形式!
「jpg」・「png」・「bmp」を「webP」へ変換しようとして、画像変換してくれるフリーソフトを探しても、存のソフトはまとめてではなく、1枚ずつ画像変換するものも多く、数百枚の画像を変換したい人にとっては不便です。
また、フリーソフトは全てが優良というわけではなく、
途中から有料になったり、安全性を確かめたりしないといけません。
このように、なかなか自分が求めるフリーソフトが見つけられないことがあります。
したがって本記事では、Pythonを使って、まとめて画像を変換するスクリプトを作成します。
- 「jpg」・「png」・「bmp」を「webP」へ画像変換したい。
- フリーソフトを使わずに画像変換したい。
- Pythonの「image」・「os」ライブラリについて知りたい。
PIL・pillow
PILは、Python Imaging Libraryの略で、画像処理のためのPythonライブラリです。
現在、PILは開発が停止されており、Pillowライブラリが推奨されています。
PILとPillowは同様に、画像ファイルの読み込みや書き込み、リサイズ、回転、トリミングなどの機能を提供します。
公式サイト:「Pillow (PIL Fork) 9.5.0 documentation」
導入(インストール)
Pillowライブラリのインストールは、コマンドプロンプトにて行います。
コマンドプロンプトを開いたら、
pip install pillow
と入力してインストールを完了させます。
使用方法
インストールを終えたら、導入できているか確認します。
以下のコードを入力してください。
from PIL import Image
# 画像を開く
image = Image.open("image.jpg")
# 画像の情報を表示する
print(image.format, image.size, image.mode)
PILモジュールからImageクラスをインポートします。
これにより、画像の処理に必要な機能が使用できるようになります。
from PIL import Image
Image.open()メソッドを使用して、指定したファイルパス(”image.jpg”)の画像を開きます。
開かれた画像はimageという変数に代入されます。
このとき、スクリプトと画像は同じ場所に保存してください。
もし、違う場合は、ファイルパスの指定を厳密に行ってください。
image = Image.open("image.jpg")
imageオブジェクトのformat、size、およびmode属性を表示します。それぞれの属性は以下の意味を持ちます。
- format:画像のフォーマット(例: JPG、PNG、BMPなど)が表示されます。
- size: 画像の幅と高さのタプルが表示されます(例: (800, 600))。
- mode: 画像の色モード(RGB)が表示されます。色モードは、画像がどのように色情報を表現しているかを示します。
print(image.format, image.size, image.mode)
GoogleColaboratoryで実行
GoogleColaboratoryは、Googleアカウントを持っていれば無料でPythonを操作することができるウェブサービスです。
初めに、フォルダーマークを選択して、枠内に画像をドラッグ&ドロップしてください。
その後、実行すると、先ほどと同様の結果が得られます。
GoogleColaboratoryを使用すれば、PC内にPythonのライブラリのインストールは不要です。
os
Pythonの os モジュールは、Pythonでファイルやディレクトリを操作するためのモジュールです。このモジュールを使用すると、ファイルやディレクトリの作成、削除、移動、名前変更などができます。また、ファイルやディレクトリの存在を確認することもできます。
ファイルとディレクトリはコンピュータ上でデータを管理するために使用される概念です。ファイルはデータ(テキスト、画像、音声、ビデオなど)を格納するための単位であり、ディレクトリはファイルや他のディレクトリを含むコンテナです。
ディレクトリの作成と削除
作成と削除は以下のメソッドを使用します。
- os.mkdir(path): 指定したパスにディレクトリを作成します。
- os.makedirs(path): 指定したパスにディレクトリを再帰的に作成します。
- os.rmdir(path): 指定したパスのディレクトリを削除します。
ファイルの操作
ファイルの操作は先ほどのディレクトリとは異なるので、混同しないように注意してください。
- os.remove(path): 指定したパスのファイルを削除します。
- os.rename(src, dst): 指定したパスのファイルまたはディレクトリの名前を変更します。
ファイルやディレクトリの存在の確認
以下のメソッドはディレクトリでもファイルでも共通しています。
- os.path.exists(path): 指定したパスが存在するかどうかを確認します。
- os.path.isfile(path): 指定したパスがファイルかどうかを確認します。
- os.path.isdir(path): 指定したパスがディレクトリかどうかを確認します。
フォルダー内の画像をまとめてwebpに変換する
ここまで、pillowライブラリとosモジュールについて理解しました。
ここからは、これら2つを使ってフォルダA(input)内の画像「jpg」・「png」・「bmp」を「webP」へ変換して、フォルダーB(output)へ保存します。
ソースコード
from PIL import Image
import os
def convert_to_webp(input_folder, output_folder):
# 出力フォルダが存在しない場合は作成する
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のファイルを取得する
file_list = os.listdir(input_folder)
for file_name in file_list:
# ファイルの絶対パスを取得する
input_path = os.path.join(input_folder, file_name)
# ファイルの拡張子を確認し、画像ファイルであれば変換する
if os.path.isfile(input_path) and file_name.lower().endswith(('.png', '.jpg', '.jpeg', '.gif','.bmp')):
# 出力ファイルの絶対パスを作成する
output_path = os.path.join(output_folder, os.path.splitext(file_name)[0] + '.webp')
# 画像を開いてWebP形式で保存する
with Image.open(input_path) as image:
image.save(output_path, 'webp')
print(f'変換完了: {file_name} -> {os.path.basename(output_path)}')
# フォルダのパスを指定して変換を実行する
input_folder = 'input'
output_folder = 'output'
convert_to_webp(input_folder, output_folder)
UdemyでPythonを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonをインストールから環境設定、基本文法が学習
さらに暗号化、インフラ自動化、非同期処理についても学べます。
Pythonを基礎から応用まで学びたい人におすすめ
- みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2024年最新版】
機械学習ライブラリで文字認識や株価分析などを行う。
人口知能やニューラルネットワーク、機械学習を学びたい人におすすめ。
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
統計分析、機械学習の実装、ディープラーニングの実装を学習。
データサイエンティストになりたい人におすすめ。
- 0から始めるTkinterの使い方完全マスター講座〜Python×GUIの基礎・応用〜
TkinterのGUIを作成から発展的な操作までアプリ実例を示して学習。
アプリ開発したい人におすすめ。
解説
初めに、PIL モジュールと os モジュールをインポートしています。
from PIL import Image
import os
つづいて、convert_to_webp 関数を定義しています。
この関数は、入力フォルダと出力フォルダのパスを引数として受け取ります。
出力フォルダが存在しない場合は、os.makedirs 関数を使用して出力フォルダ「output_folder」を作成します。
os.listdir(input_folder)関数 は、入力フォルダーの「input_folder」パス内のファイルとディレクトリのリストを返します。
そして、file_list 変数に、入力フォルダ内のファイルとディレクトリのリストが格納します。
リスト内の要素をfor 文でfile_name変数へ順番に代入します。
os.path.join(input_folder, file_name)関数で、入力フォルダのパスとファイル名を結合して、ファイルの絶対パスを作成し、input_folder内の各ファイルの絶対パスを取得します。
def convert_to_webp(input_folder, output_folder):
# 出力フォルダが存在しない場合は作成する
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のファイルを取得する
file_list = os.listdir(input_folder)
for file_name in file_list:
# ファイルの絶対パスを取得する
input_path = os.path.join(input_folder, file_name)
ファイルの拡張子が画像ファイルであるかどうかを確認します。endswithメソッドを使用して、拡張子が .png、.jpg、.jpeg、.gif、または .bmp であることをチェックしています。
endswith() メソッドは、文字列が指定された文字列で終わるかどうかを判定するために使用される文字列メソッドです。
endswith() メソッドは、ファイルの拡張子や特定のパターンを持つ文字列をフィルタリングしたり、条件に基づいて処理を制御したりするためによく使用されます。
text = "I'm Alicia!"
# 文字列の末尾が指定された文字列で終わるかを判定する
print(text.endswith("Alicia!")) # True
print(text.endswith("alicia!")) # False(小文字・大文字も判定される)
# 複数の文字列で終わるかを判定する
print(text.endswith(("!", "?", "."))) # True
# インデックス範囲を指定して終わりの部分文字列の一致を判定する
print(text.endswith("World", 0, 13)) # True
画像ファイルの場合は、出力ファイルの絶対パスを作成します。ここでは、os.path.splitext 関数を使用してファイル名と拡張子を分割し、新しい拡張子 .webp を追加しています。
# ファイルの拡張子を確認し、画像ファイルであれば変換する
if os.path.isfile(input_path) and file_name.lower().endswith(('.png', '.jpg', '.jpeg', '.gif','.bmp')):
# 出力ファイルの絶対パスを作成する
output_path = os.path.join(output_folder, os.path.splitext(file_name)[0] + '.webp')
Image.open 関数を使用して画像を開きます。この関数は画像ファイルを読み込み、Image オブジェクトを返します。
image.save メソッドを使用して、開いた画像をWebP形式で保存します。出力パスと保存形式「.webp」を指定します。
変換が完了したら、変換前のファイル名と変換後のファイル名を表示します。
# 画像を開いてWebP形式で保存する
with Image.open(input_path) as image:
image.save(output_path, 'webp')
print(f'変換完了: {file_name} -> {os.path.basename(output_path)}')
withステートメントは、リソースの取得と解放を自動的に行うためのブロックを定義します。
asキーワードは、with ステートメントで取得したリソースを参照するための変数を定義するために使用されます。変数名の後に as キーワードを記述し、その後に参照するための変数名を記述します。
with…as…の構文は次の通りです。
with オブジェクトの取得 as 変数:
# リソースを利用した処理
今回は、Image.open(input_path)で、input_pathに指定された画像ファイルを開くための Image オブジェクトを作成します。
as imageで、開いた画像を参照するための変数 image を定義しています。
image変数を使用して操作や処理を行います。
image.save(output_path, ‘webp’) で開いた画像をWebP形式で保存しています。
最後に、convert_to_webp 関数を呼び出して、指定した入力フォルダと出力フォルダで変換を実行します。
# フォルダのパスを指定して変換を実行する
input_folder = 'input'
output_folder = 'output'
convert_to_webp(input_folder, output_folder)
実演
inputフォルダーに変換した画像を入れます。
今回のコードでは、画像の形式が、 .png、.jpg、.jpeg、.gif、または .bmp 以外だとエラーが生じます。
次に、スクリプトを動かすと、冒頭で紹介したような動作をします。
以下のように、画像の形式が変わっていれば、画像変換は成功しています。
画像変換前(bmp)
画像変換後(webp)
webpの変換フリーソフト
変換ソフトのフリーソフトは配布されていますが、
機能が物足りない。有料になるなど不便な子もが多いです。
上記のコードをexeファイル化することでwebpの変換できるフリーソフトを作成できます。
exe化すると、Pythonの構築ができてないPCでも動かすことができて非常に便利です。
まとめ
今回は、PIL モジュールと os モジュールを使ってPythonで、png、jpg、jpeg、gif、bmpなど様々な画像形式からwebPに一括で画像変換する方法を紹介しました。
Pythonで画像変換をすれば、フリーソフトを探す手間もなく、windows・MacなどOSに依存せずに使用することができます。
また、既存のソフトでは、一枚ずつ画像変換をして、まとめてできるものを探す必要もありません。
本製作を応用すれば、avifやheicの画像変換もできるようになります。