PythonでJPG/PNGを最先端のAVIFに変換する方法

画像フォーマット革命!PythonでJPG/PNGを最先端のAVIFに変換する方法 プログラミング

画像処理では、ファイルサイズを減らしながら画質を保つことが重要です。
特に、Webページの速度やストレージ節約のためです。

この記事では、PythonのPillowとpillow-avif-pluginを使った方法を紹介します。
これにより、JPGやPNGから最新のAVIFフォーマットへ変換できます。

AVIFは、優れた圧縮率と高画質で知られています。
この技術を使えば、Webサイトやアプリの性能を向上させられます。

必要なツールのインストール

AVIF画像への変換に必要なツールとライブラリのインストール方法について詳しく解説します。
Pythonを活用し、JPGやPNGファイルを効率的にAVIFフォーマットに変換するためには、
Pillowライブラリ及びpillow-avif-pluginが必要です。

Python

大前提として、Pythonのインストールがあります。
Python 3.7以降の利用を推奨します。

Pythonについては、次の記事で解説しています。

Pillow

Pillowは、Pythonで最も人気のある画像処理ライブラリの一つです。
Pillowのインストールは、次の記事で説明しています。

Pillowのインストールは、次のコマンドを行います。

pip install Pillow

pillow-avif-plugin

pillow-avif-pluginは、Pillowライブラリの拡張機能で、AVIFフォーマットへのサポートを追加します。
次のコマンドを使用して、pillow-avif-pluginをインストールできます。

pip install pillow-avif-plugin

すべてのインストールが完了したら、Pythonインタープリタまたはスクリプトから以下のコードを実行して、
Pillowとpillow-avif-pluginが正しくインストールされていることを確認します。

from PIL import Image
import pillow_avif

print("Pillowとpillow-avif-pluginが正しくインストールされました!")

上記コードが、エラー無く実行されれば必要なモノは準備完了です。

Pillowとpillow-avif-pluginを使った画像のリサイズとAVIFへの変換

PythonのPillowライブラリとpillow-avif-pluginを使って、
既存の画像ファイル(例えばJPGやPNG)をAVIF形式に変換するコードを紹介します。

from PIL import Image
import pillow_avif

# JPEG画像を開く
img = Image.open("image.png")

# 元の画像のサイズを取得
width, height = img.size

# 新しい横幅を指定
new_width = 500

# 縦幅を元の比率で計算
new_height = int((new_width / width) * height)

# 新しいサイズで画像をリサイズ
resized_img = img.resize((new_width, new_height), resample=Image.LANCZOS)

# AVIF形式で保存
resized_img.save("image.avif", format="AVIF")

処理内容は、大きく分けて以下の二つです。

  • 画像のリサイズ
  • AVIF形式での保存

画像のリサイズ

まず、Image.openメソッドを使用して画像ファイルを開きます。
元の画像のサイズをimg.sizeで取得し、新しいサイズを計算します。

この例では、新しい横幅を500ピクセルに設定し、縦幅は元の画像のアスペクト比を維持しつつ計算します。
img.resizeメソッドを用いて、指定した新しいサイズで画像をリサイズします。

ここではImage.LANCZOSフィルタを使用して、高品質なリサイズ結果を得ます。

AVIF形式での保存

リサイズした画像をAVIF形式で保存します。
resized_img.saveメソッドを使用し、ファイル名とフォーマット(この場合は”AVIF”)を指定します。

動作確認

上記のスクリプトを実行する前に、
対象となる画像ファイルがスクリプトと同じディレクトリにあることを確認してください

スクリプトを実行後、生成されたimage.avifファイルを開いて、
リサイズとフォーマット変換が期待通りに行われたかを確認します。

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