[Python] 画像をjpg形式に圧縮してファイルサイズを縮小する方法
Pythonで画像をJPEG形式に圧縮してファイルサイズを縮小するには、Pillowライブラリを使用します。
まず、PIL.Image
モジュールをインポートし、画像を開きます。
次に、save()メソッド
を使ってJPEG形式で保存します。
この際、quality
パラメータを指定することで圧縮率を調整できます。
quality
は1から95の範囲で指定し、値が低いほど圧縮率が高くなり、ファイルサイズが小さくなりますが、画質が低下します。
Pillowライブラリのインストールと基本的な使い方
Pillowとは?
Pillowは、Pythonで画像処理を行うためのライブラリです。
画像の読み込み、表示、保存、変換、フィルタリングなど、さまざまな機能を提供しています。
Pillowは、Python Imaging Library (PIL) のフォークであり、より多くの機能とサポートが追加されています。
特に、JPEG、PNG、GIFなどの一般的な画像フォーマットを扱うことができます。
Pillowのインストール方法
Pillowは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。
以下のコマンドを実行してください。
pip install Pillow
このコマンドを実行することで、Pillowライブラリがインストールされます。
インストールが完了したら、Pythonのスクリプト内でPillowを使用できるようになります。
画像を開く方法
Pillowを使用して画像を開くには、Image
モジュールをインポートし、openメソッド
を使用します。
以下は、画像を開くサンプルコードです。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
image.show() # 画像を表示
このコードを実行すると、指定した画像ファイルが開かれ、表示されます。
画像を保存する方法
画像を保存するには、saveメソッド
を使用します。
以下のサンプルコードでは、画像をJPEG形式で保存します。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
# 画像をJPEG形式で保存
image.save("sample_saved.jpg", "JPEG")
このコードを実行すると、sample_saved.jpg
という名前で画像が保存されます。
画像フォーマットの変換
Pillowを使用すると、画像のフォーマットを簡単に変換できます。
以下のサンプルコードでは、PNG形式の画像をJPEG形式に変換します。
from PIL import Image
# PNG画像を開く
image = Image.open("sample.png")
# JPEG形式で保存
image.save("sample_converted.jpg", "JPEG")
このコードを実行すると、sample.png
がJPEG形式に変換され、sample_converted.jpg
として保存されます。
JPEG形式で画像を圧縮する方法
JPEG形式とは?
JPEG(Joint Photographic Experts Group)形式は、画像データを圧縮するための一般的なフォーマットです。
特に写真や複雑な画像に適しており、圧縮率が高く、ファイルサイズを小さくすることができます。
JPEG形式は、圧縮時に画質が劣化することがありますが、適切な設定を行うことで、視覚的にほとんど影響を与えずにファイルサイズを削減できます。
画像をJPEG形式で保存する方法
Pillowを使用して画像をJPEG形式で保存するには、saveメソッド
を使用します。
以下のサンプルコードでは、画像をJPEG形式で保存する方法を示します。
from PIL import Image
# 画像を開く
image = Image.open("sample.png")
# JPEG形式で保存
image.save("sample_saved.jpg", "JPEG")
このコードを実行すると、sample.png
がJPEG形式でsample_saved.jpg
として保存されます。
qualityパラメータの役割
JPEG形式で画像を保存する際、quality
パラメータを指定することで、圧縮率を調整できます。
このパラメータは0から100の範囲で設定でき、数値が高いほど画質が良く、ファイルサイズが大きくなります。
逆に、数値が低いほど画質が劣化し、ファイルサイズが小さくなります。
以下のサンプルコードでは、quality
パラメータを使用して画像を保存します。
from PIL import Image
# 画像を開く
image = Image.open("sample.png")
# JPEG形式で保存(画質80)
image.save("sample_quality_80.jpg", "JPEG", quality=80)
このコードを実行すると、画質80でJPEG形式の画像が保存されます。
圧縮率と画質のバランス
JPEG形式の圧縮では、圧縮率と画質のバランスが重要です。
高い圧縮率を設定すると、ファイルサイズは小さくなりますが、画質が劣化する可能性があります。
逆に、低い圧縮率では画質が保たれますが、ファイルサイズが大きくなります。
最適なバランスを見つけるためには、いくつかの異なるquality
設定で画像を保存し、視覚的に比較することが推奨されます。
圧縮後のファイルサイズ確認方法
圧縮後のファイルサイズを確認するには、Pythonのos
モジュールを使用してファイルのサイズを取得できます。
以下のサンプルコードでは、圧縮後のJPEG画像のファイルサイズを確認します。
import os
# 圧縮後のファイル名
file_name = "sample_quality_80.jpg"
# ファイルサイズを取得
file_size = os.path.getsize(file_name)
# ファイルサイズを表示
print(f"{file_name}のファイルサイズ: {file_size}バイト")
このコードを実行すると、指定したJPEG画像のファイルサイズが表示されます。
これにより、圧縮の効果を確認することができます。
画像の圧縮を自動化する
複数の画像を一括で圧縮する方法
複数の画像を一括で圧縮するには、Pythonのos
モジュールを使用して指定したフォルダ内のすべての画像ファイルを処理します。
以下のサンプルコードでは、指定したフォルダ内のすべてのJPEG画像を圧縮します。
import os
from PIL import Image
# 圧縮する画像が保存されているフォルダ
input_folder = "images"
output_folder = "compressed_images"
# 出力フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のすべてのJPEG画像を圧縮
for filename in os.listdir(input_folder):
if filename.endswith(".jpg") or filename.endswith(".jpeg"):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path)
# 圧縮して保存
image.save(os.path.join(output_folder, filename), "JPEG", quality=80)
このコードを実行すると、images
フォルダ内のすべてのJPEG画像が圧縮され、compressed_images
フォルダに保存されます。
フォルダ内の画像を再帰的に圧縮する方法
フォルダ内の画像を再帰的に圧縮するには、os.walk
を使用してサブフォルダも含めてすべての画像を処理します。
以下のサンプルコードでは、指定したフォルダ内のすべてのJPEG画像を再帰的に圧縮します。
import os
from PIL import Image
# 圧縮する画像が保存されているフォルダ
input_folder = "images"
output_folder = "compressed_images"
# 出力フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のすべてのJPEG画像を再帰的に圧縮
for root, dirs, files in os.walk(input_folder):
for filename in files:
if filename.endswith(".jpg") or filename.endswith(".jpeg"):
image_path = os.path.join(root, filename)
image = Image.open(image_path)
# 出力パスを作成
output_path = os.path.join(output_folder, os.path.relpath(image_path, input_folder))
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# 圧縮して保存
image.save(output_path, "JPEG", quality=80)
このコードを実行すると、images
フォルダ内のすべてのJPEG画像が再帰的に圧縮され、compressed_images
フォルダに保存されます。
圧縮後のファイル名の管理方法
圧縮後のファイル名を管理するためには、元のファイル名に接尾辞を追加する方法が一般的です。
以下のサンプルコードでは、圧縮後のファイル名に_compressed
を追加しています。
import os
from PIL import Image
# 圧縮する画像が保存されているフォルダ
input_folder = "images"
output_folder = "compressed_images"
# 出力フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のすべてのJPEG画像を圧縮
for filename in os.listdir(input_folder):
if filename.endswith(".jpg") or filename.endswith(".jpeg"):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path)
# 圧縮後のファイル名を作成
compressed_filename = f"{os.path.splitext(filename)[0]}_compressed.jpg"
image.save(os.path.join(output_folder, compressed_filename), "JPEG", quality=80)
このコードを実行すると、圧縮後のファイル名が元のファイル名に_compressed
を追加した形で保存されます。
圧縮前後のファイルサイズを比較する方法
圧縮前後のファイルサイズを比較するには、os.path.getsize
を使用してファイルサイズを取得し、表示します。
以下のサンプルコードでは、圧縮前後のファイルサイズを比較します。
import os
from PIL import Image
# 圧縮する画像が保存されているフォルダ
input_folder = "images"
output_folder = "compressed_images"
# 出力フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のすべてのJPEG画像を圧縮
for filename in os.listdir(input_folder):
if filename.endswith(".jpg") or filename.endswith(".jpeg"):
image_path = os.path.join(input_folder, filename)
original_size = os.path.getsize(image_path) # 圧縮前のファイルサイズ
image = Image.open(image_path)
compressed_filename = f"{os.path.splitext(filename)[0]}_compressed.jpg"
image.save(os.path.join(output_folder, compressed_filename), "JPEG", quality=80)
compressed_size = os.path.getsize(os.path.join(output_folder, compressed_filename)) # 圧縮後のファイルサイズ
# ファイルサイズを表示
print(f"{filename} - 圧縮前: {original_size}バイト, 圧縮後: {compressed_size}バイト")
このコードを実行すると、各画像の圧縮前後のファイルサイズが表示され、圧縮の効果を確認できます。
圧縮時の注意点
圧縮による画質の劣化
JPEG形式で画像を圧縮する際、画質が劣化する可能性があります。
圧縮率が高いほど、画像の細部が失われ、ぼやけた印象を与えることがあります。
特に、テキストや細かいパターンが含まれる画像では、圧縮による劣化が顕著に現れることがあります。
したがって、圧縮率を設定する際は、画質とファイルサイズのバランスを考慮することが重要です。
最適な設定を見つけるために、いくつかの異なるquality
値で画像を保存し、視覚的に比較することが推奨されます。
圧縮率が高すぎる場合の問題
圧縮率が高すぎると、画像の視覚的な品質が著しく低下するだけでなく、アーティファクト(圧縮によって生じる不自然な模様やノイズ)が発生することがあります。
これにより、画像が不自然に見えたり、重要なディテールが失われたりすることがあります。
特に、風景や人物の写真など、色のグラデーションが滑らかな画像では、圧縮率を高く設定すると、色の階調が不自然になることがあります。
適切な圧縮率を選ぶことが、画像の品質を保つために重要です。
圧縮後の画像の色合いの変化
JPEG圧縮は、画像の色合いにも影響を与えることがあります。
特に、圧縮率が高い場合、色の再現性が低下し、元の画像と比較して色合いが変わることがあります。
これにより、特定の色が強調されたり、逆に薄くなったりすることがあります。
色合いの変化を最小限に抑えるためには、圧縮率を適切に設定し、圧縮後の画像を確認することが重要です。
また、色空間(RGBやCMYKなど)を考慮することも、色合いの変化を抑えるために役立ちます。
圧縮後の画像のメタデータの扱い
JPEG画像には、Exif情報やIPTC情報などのメタデータが含まれることがあります。
これらのメタデータには、撮影日時、カメラの設定、位置情報などが含まれ、画像の管理や検索に役立ちます。
しかし、JPEG形式で画像を圧縮する際、メタデータが失われることがあります。
特に、Pillowを使用して画像を保存する際に、メタデータを保持するオプションを指定しないと、圧縮後の画像からメタデータが削除されることがあります。
メタデータを保持したい場合は、以下のようにsaveメソッド
のexif
パラメータを使用して、元の画像からメタデータを引き継ぐことができます。
from PIL import Image
# 画像を開く
image = Image.open("sample_with_metadata.jpg")
# メタデータを取得
exif_data = image.info.get('exif')
# JPEG形式で保存(メタデータを保持)
image.save("sample_with_metadata_saved.jpg", "JPEG", quality=80, exif=exif_data)
このようにして、圧縮後の画像でもメタデータを保持することができます。
メタデータの管理は、画像の整理や情報の追跡において重要な要素です。
応用例:画像のリサイズと圧縮を組み合わせる
画像のリサイズ方法
画像のリサイズは、Pillowライブラリを使用して簡単に行えます。
resizeメソッド
を使用することで、指定したサイズに画像を変更できます。
以下のサンプルコードでは、画像を指定した幅と高さにリサイズする方法を示します。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
# 新しいサイズを指定
new_size = (800, 600) # 幅800px、高さ600px
# 画像をリサイズ
resized_image = image.resize(new_size)
# リサイズした画像を保存
resized_image.save("sample_resized.jpg")
このコードを実行すると、sample.jpg
が800×600ピクセルにリサイズされ、sample_resized.jpg
として保存されます。
リサイズと圧縮の組み合わせによるファイルサイズ削減
リサイズと圧縮を組み合わせることで、ファイルサイズを大幅に削減できます。
リサイズによって画像のピクセル数が減少し、圧縮によってファイルサイズがさらに小さくなります。
以下のサンプルコードでは、画像をリサイズし、圧縮して保存する方法を示します。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
# 新しいサイズを指定
new_size = (800, 600) # 幅800px、高さ600px
# 画像をリサイズ
resized_image = image.resize(new_size)
# リサイズした画像をJPEG形式で圧縮して保存
resized_image.save("sample_resized_compressed.jpg", "JPEG", quality=80)
このコードを実行すると、リサイズされた画像が圧縮されて保存され、ファイルサイズが削減されます。
リサイズ後の画質調整
リサイズ後の画像の画質を調整するためには、リサイズ時に使用するフィルタを指定することができます。
Pillowでは、Image.LANCZOS
やImage.BILINEAR
などのフィルタを使用して、リサイズ時の画質を向上させることができます。
以下のサンプルコードでは、LANCZOSフィルタを使用してリサイズを行います。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
# 新しいサイズを指定
new_size = (800, 600) # 幅800px、高さ600px
# LANCZOSフィルタを使用して画像をリサイズ
resized_image = image.resize(new_size, Image.LANCZOS)
# リサイズした画像をJPEG形式で圧縮して保存
resized_image.save("sample_resized_quality_adjusted.jpg", "JPEG", quality=80)
このコードを実行すると、LANCZOSフィルタを使用してリサイズされた画像が保存され、画質が向上します。
リサイズと圧縮の自動化
リサイズと圧縮を自動化するには、フォルダ内のすべての画像に対して処理を行うループを作成します。
以下のサンプルコードでは、指定したフォルダ内のすべてのJPEG画像をリサイズし、圧縮して保存します。
import os
from PIL import Image
# 圧縮する画像が保存されているフォルダ
input_folder = "images"
output_folder = "resized_compressed_images"
# 出力フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のすべてのJPEG画像をリサイズと圧縮
for filename in os.listdir(input_folder):
if filename.endswith(".jpg") or filename.endswith(".jpeg"):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path)
# 新しいサイズを指定
new_size = (800, 600) # 幅800px、高さ600px
# LANCZOSフィルタを使用して画像をリサイズ
resized_image = image.resize(new_size, Image.LANCZOS)
# リサイズした画像をJPEG形式で圧縮して保存
resized_image.save(os.path.join(output_folder, filename), "JPEG", quality=80)
このコードを実行すると、images
フォルダ内のすべてのJPEG画像がリサイズされ、圧縮されてresized_compressed_images
フォルダに保存されます。
これにより、手間をかけずに大量の画像を処理することができます。
応用例:Web用に最適化された画像の作成
Web用画像の最適な解像度と圧縮率
Web用に画像を最適化する際、解像度と圧縮率は非常に重要な要素です。
一般的に、Webサイトに表示する画像の解像度は、表示されるサイズに合わせて調整することが推奨されます。
例えば、フルHD(1920×1080ピクセル)の画面で表示する場合、画像の解像度はそれに合わせて設定します。
また、圧縮率は通常、画質を保ちながらファイルサイズを小さくするために70〜80%程度が推奨されます。
これにより、ページの読み込み速度が向上し、ユーザー体験が改善されます。
WebP形式との比較
WebPは、Googleが開発した画像フォーマットで、JPEGやPNGよりも高い圧縮率を実現しながら、画質を保つことができます。
WebP形式は、特にWeb用に最適化されており、ファイルサイズを小さくすることでページの読み込み速度を向上させることができます。
以下の表は、JPEGとWebPの比較を示しています。
特徴 | JPEG | WebP |
---|---|---|
圧縮率 | 中程度 | 高い |
画質 | 良好 | 非常に良好 |
アニメーション対応 | なし | あり |
透過性 | なし | あり |
ブラウザサポート | 幅広い | 一部(Chrome, Firefox等) |
WebP形式を使用することで、同じ画質を保ちながらファイルサイズを大幅に削減できるため、Webサイトのパフォーマンス向上に寄与します。
サムネイル画像の作成と圧縮
サムネイル画像は、Webサイトでの表示速度を向上させるために重要です。
サムネイルは通常、元の画像よりも小さいサイズで表示されるため、リサイズと圧縮を行うことでファイルサイズを削減できます。
以下のサンプルコードでは、元の画像からサムネイルを作成し、圧縮して保存する方法を示します。
from PIL import Image
# 画像を開く
image = Image.open("sample.jpg")
# サムネイルサイズを指定
thumbnail_size = (150, 150) # 幅150px、高さ150px
# サムネイルを作成
image.thumbnail(thumbnail_size)
# サムネイルをJPEG形式で圧縮して保存
image.save("sample_thumbnail.jpg", "JPEG", quality=80)
このコードを実行すると、元の画像から150×150ピクセルのサムネイルが作成され、圧縮されて保存されます。
画像の圧縮とSEOの関係
画像の圧縮は、WebサイトのSEO(検索エンジン最適化)にも影響を与えます。
ページの読み込み速度は、検索エンジンのランキング要因の一つであり、画像が重いとページの読み込みが遅くなり、ユーザー体験が悪化します。
これにより、直帰率が増加し、SEOに悪影響を及ぼす可能性があります。
画像を適切に圧縮し、最適化することで、ページの読み込み速度を向上させ、SEO効果を高めることができます。
また、画像のファイル名やalt属性を適切に設定することもSEOに寄与します。
ファイル名にはキーワードを含め、alt属性には画像の内容を説明するテキストを設定することで、検索エンジンが画像を理解しやすくなります。
これにより、画像検索からのトラフィックを増やすことが期待できます。
応用例:GUIを使った画像圧縮ツールの作成
Tkinterを使った簡単なGUIの作成
PythonのTkinterライブラリを使用して、簡単なGUI(グラフィカルユーザーインターフェース)を作成することができます。
以下のサンプルコードでは、基本的なウィンドウを作成し、タイトルを設定する方法を示します。
import tkinter as tk
# メインウィンドウの作成
root = tk.Tk()
root.title("画像圧縮ツール")
# ウィンドウのサイズを設定
root.geometry("400x300")
# メインループを開始
root.mainloop()
このコードを実行すると、タイトルが「画像圧縮ツール」のウィンドウが表示されます。
これを基に、さらに機能を追加していきます。
画像選択機能の実装
画像選択機能を実装するには、tkinter.filedialog
モジュールを使用してファイル選択ダイアログを表示します。
以下のサンプルコードでは、ボタンをクリックすると画像ファイルを選択できるようにします。
import tkinter as tk
from tkinter import filedialog
def select_image():
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
if file_path:
print(f"選択された画像: {file_path}")
# メインウィンドウの作成
root = tk.Tk()
root.title("画像圧縮ツール")
root.geometry("400x300")
# 画像選択ボタンの作成
select_button = tk.Button(root, text="画像を選択", command=select_image)
select_button.pack(pady=20)
# メインループを開始
root.mainloop()
このコードを実行すると、「画像を選択」ボタンをクリックすることで、画像ファイルを選択できるダイアログが表示されます。
選択した画像のパスがコンソールに表示されます。
圧縮率を調整できるスライダーの追加
圧縮率を調整するためのスライダーを追加するには、tkinter.Scale
ウィジェットを使用します。
以下のサンプルコードでは、圧縮率を0から100の範囲で調整できるスライダーを追加します。
import tkinter as tk
from tkinter import filedialog
def select_image():
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
if file_path:
print(f"選択された画像: {file_path}")
# メインウィンドウの作成
root = tk.Tk()
root.title("画像圧縮ツール")
root.geometry("400x300")
# 画像選択ボタンの作成
select_button = tk.Button(root, text="画像を選択", command=select_image)
select_button.pack(pady=20)
# 圧縮率スライダーの作成
compression_slider = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, label="圧縮率 (%)")
compression_slider.set(80) # デフォルト値を80に設定
compression_slider.pack(pady=20)
# メインループを開始
root.mainloop()
このコードを実行すると、圧縮率を調整するためのスライダーが表示され、ユーザーが圧縮率を選択できるようになります。
圧縮後のプレビュー機能の実装
圧縮後の画像をプレビューするためには、選択した画像を圧縮し、プレビュー用のラベルに表示します。
以下のサンプルコードでは、選択した画像を圧縮し、圧縮後の画像を表示する機能を追加します。
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
def select_image():
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
if file_path:
compress_and_preview(file_path)
def compress_and_preview(file_path):
# 圧縮率を取得
quality = compression_slider.get()
# 画像を開く
image = Image.open(file_path)
# 圧縮して保存(一時ファイルとして保存)
compressed_image_path = "compressed_image.jpg"
image.save(compressed_image_path, "JPEG", quality=quality)
# 圧縮後の画像を表示
compressed_image = Image.open(compressed_image_path)
compressed_image.thumbnail((200, 200)) # プレビュー用にサイズを調整
photo = ImageTk.PhotoImage(compressed_image)
# 既存のラベルを削除
for widget in preview_frame.winfo_children():
widget.destroy()
# 新しいラベルを作成して表示
label = tk.Label(preview_frame, image=photo)
label.image = photo # 参照を保持
label.pack()
# メインウィンドウの作成
root = tk.Tk()
root.title("画像圧縮ツール")
root.geometry("400x500")
# 画像選択ボタンの作成
select_button = tk.Button(root, text="画像を選択", command=select_image)
select_button.pack(pady=20)
# 圧縮率スライダーの作成
compression_slider = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, label="圧縮率 (%)")
compression_slider.set(80) # デフォルト値を80に設定
compression_slider.pack(pady=20)
# プレビュー用のフレームを作成
preview_frame = tk.Frame(root)
preview_frame.pack(pady=20)
# メインループを開始
root.mainloop()
このコードを実行すると、選択した画像が圧縮され、圧縮後の画像がプレビューとして表示されます。
これにより、ユーザーは圧縮率を調整しながら、リアルタイムで圧縮後の画像を確認することができます。
まとめ
この記事では、Pythonを使用して画像をJPEG形式に圧縮し、ファイルサイズを縮小する方法について詳しく解説しました。
また、Pillowライブラリを活用した画像のリサイズや圧縮の自動化、さらにはWeb用に最適化された画像の作成方法についても触れました。
これらの知識を活用することで、画像の管理やWebサイトのパフォーマンス向上に役立てることができるでしょう。
ぜひ、実際に手を動かして画像圧縮ツールを作成したり、最適化を行ったりして、効果を実感してみてください。