[Python] png形式をjpg形式に変換する方法
PythonでPNG形式の画像をJPG形式に変換するには、Pillowライブラリを使用します。
PillowはPythonの画像処理ライブラリで、インストールはpip install Pillow
で行います。
変換の際には、まずPNG画像をImage.open()
で読み込み、次にconvert('RGB')
でRGBモードに変換し、最後にsave()メソッド
でJPG形式で保存します。
PNGは透過情報を持つことがあるため、JPGに変換する際は透過部分が白などで埋められます。
Pillowライブラリのインストールと基本設定
Pythonで画像処理を行うためのライブラリ Pillow
は、PNG形式の画像をJPG形式に変換する際にも非常に便利です。
まず、Pillowをインストールするには、以下のコマンドをターミナルまたはコマンドプロンプトで実行します。
pip install Pillow
インストールが完了したら、Pythonスクリプト内でPillowを使用するために、次のようにインポートします。
from PIL import Image
これで、Pillowライブラリを使った画像処理が可能になります。
基本的な設定はこれだけで完了です。
次に、PNGからJPGへの変換手順に進むことができます。
PNGからJPGへの変換手順
画像ファイルの読み込み
まず、Pillowを使ってPNG形式の画像ファイルを読み込みます。
以下のコードでは、input.png
というファイルを読み込む例を示します。
from PIL import Image
# 画像ファイルの読み込み
image = Image.open('input.png')
RGBモードへの変換
PNG画像には透過情報が含まれている場合がありますが、JPG形式は透過をサポートしていません。
そのため、画像をRGBモードに変換する必要があります。
以下のコードで変換を行います。
# RGBモードへの変換
image = image.convert('RGB')
JPG形式での保存
次に、変換した画像をJPG形式で保存します。
保存時には、ファイル名をoutput.jpg
と指定します。
以下のコードを使用します。
# JPG形式での保存
image.save('output.jpg', 'JPEG')
透過部分の処理方法
PNG画像に透過部分がある場合、JPG形式に変換するとその部分は黒くなります。
透過部分を白や他の色で埋める場合は、以下のように処理します。
# 透過部分を白で埋める
background = Image.new('RGB', image.size, (255, 255, 255))
background.paste(image, (0, 0), image)
background.save('output_with_background.jpg', 'JPEG')
このようにして、透過部分を適切に処理しながらPNGからJPGへの変換を行うことができます。
変換時の注意点
透過情報の扱い
PNG形式は透過情報を持つことができますが、JPG形式は透過をサポートしていません。
そのため、PNGからJPGに変換する際には、透過部分が黒くなったり、背景色で埋められたりします。
透過部分を適切に処理するためには、事前に背景色を設定するか、別の形式で保存することを検討する必要があります。
画質の劣化について
JPG形式は圧縮形式であり、圧縮率を上げると画質が劣化します。
特に、PNGからJPGに変換する際には、圧縮設定に注意が必要です。
デフォルトでは、Pillowは画質を80%に設定していますが、必要に応じてこの値を調整することができます。
画質を維持したい場合は、以下のように指定します。
image.save('output.jpg', 'JPEG', quality=95) # 画質95%
ファイルサイズの違い
PNG形式は無圧縮または可逆圧縮であるため、ファイルサイズが大きくなることがあります。
一方、JPG形式は非可逆圧縮であり、同じ画像でもファイルサイズが小さくなることが一般的です。
ただし、画質を維持するためには、圧縮率を調整する必要があります。
変換後のファイルサイズを確認し、用途に応じて選択することが重要です。
カラープロファイルの違い
PNGとJPGではカラープロファイルの扱いが異なる場合があります。
特に、色の再現性に影響を与えることがあります。
JPG形式では、カラープロファイルが埋め込まれないことが多いため、色が変わる可能性があります。
色の一貫性を保つためには、カラープロファイルを確認し、必要に応じて変換後の画像に適切なプロファイルを設定することが推奨されます。
応用例:複数ファイルの一括変換
複数ファイルを一括で読み込む方法
複数のPNGファイルを一括で読み込むには、Pythonのos
モジュールを使用して、指定したディレクトリ内のファイルを取得します。
以下のコードでは、input_directory
にあるすべてのPNGファイルを読み込む例を示します。
import os
from PIL import Image
# 読み込むディレクトリの指定
input_directory = 'path/to/input_directory'
png_files = [f for f in os.listdir(input_directory) if f.endswith('.png')]
ループ処理を使った一括変換
読み込んだPNGファイルをループ処理を使って一括でJPG形式に変換します。
以下のコードでは、各ファイルをRGBモードに変換し、JPG形式で保存します。
# 一括変換処理
for png_file in png_files:
# 画像の読み込み
image = Image.open(os.path.join(input_directory, png_file))
# RGBモードへの変換
image = image.convert('RGB')
# JPG形式での保存
jpg_file = png_file.replace('.png', '.jpg')
image.save(os.path.join(input_directory, jpg_file), 'JPEG')
変換後のファイル名の自動設定
変換後のファイル名を自動で設定するためには、元のファイル名を基に新しいファイル名を生成します。
上記のコードでは、.png
を.jpg
に置き換えることで新しいファイル名を作成しています。
必要に応じて、日付やカスタムプレフィックスを追加することも可能です。
以下の例では、ファイル名の先頭にconverted_
を追加しています。
# 変換後のファイル名の自動設定
jpg_file = 'converted_' + png_file.replace('.png', '.jpg')
image.save(os.path.join(input_directory, jpg_file), 'JPEG')
このようにして、複数のPNGファイルを一括でJPG形式に変換し、ファイル名を自動で設定することができます。
応用例:画像のリサイズとフォーマット変換
画像のリサイズ方法
Pillowを使用して画像をリサイズするには、resizeメソッド
を利用します。
リサイズする際には、新しいサイズを指定する必要があります。
以下のコードでは、input.jpg
という画像を幅800ピクセル、高さ600ピクセルにリサイズする例を示します。
from PIL import Image
# 画像の読み込み
image = Image.open('input.jpg')
# 画像のリサイズ
new_size = (800, 600) # 新しいサイズ
resized_image = image.resize(new_size)
リサイズとフォーマット変換の組み合わせ
リサイズとフォーマット変換を同時に行うことも可能です。
以下のコードでは、PNG形式の画像をリサイズし、JPG形式で保存します。
# PNG画像の読み込み
image = Image.open('input.png')
# 画像のリサイズ
new_size = (800, 600) # 新しいサイズ
resized_image = image.resize(new_size)
# JPG形式での保存
resized_image.save('output.jpg', 'JPEG')
画質を保ちながらリサイズする方法
リサイズ時に画質を保つためには、Image.LANCZOS
フィルタを使用することが推奨されます。
このフィルタは高品質なリサイズを実現します。
以下のコードでは、リサイズ時にLANCZOSフィルタを適用しています。
# 画像のリサイズ(画質を保つためにLANCZOSフィルタを使用)
resized_image = image.resize(new_size, Image.LANCZOS)
# JPG形式での保存
resized_image.save('output_high_quality.jpg', 'JPEG', quality=95) # 画質95%
このようにして、画像のリサイズとフォーマット変換を組み合わせ、画質を保ちながら処理することができます。
応用例:Webアプリケーションでの画像変換
Flaskを使った画像変換Webアプリの作成
Flaskを使用して画像変換のWebアプリケーションを作成することができます。
まず、Flaskをインストールします。
以下のコマンドを実行してください。
pip install Flask
次に、基本的なFlaskアプリケーションを作成します。
以下のコードは、画像をアップロードするためのフォームを表示するシンプルなアプリケーションの例です。
from flask import Flask, request, render_template
from PIL import Image
import os
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html') # アップロードフォームを表示
if __name__ == '__main__':
app.run(debug=True)
ユーザーがアップロードした画像の変換
ユーザーが画像をアップロードできるようにするために、HTMLフォームを作成します。
index.html
ファイルを作成し、以下の内容を追加します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>画像変換</title>
</head>
<body>
<h1>画像変換アプリ</h1>
<form action="/convert" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png">
<input type="submit" value="変換">
</form>
</body>
</html>
次に、アップロードされた画像をJPG形式に変換するためのエンドポイントを追加します。
以下のコードをFlaskアプリに追加します。
@app.route('/convert', methods=['POST'])
def convert():
if 'image' not in request.files:
return '画像が選択されていません。'
file = request.files['image']
if file.filename == '':
return '画像が選択されていません。'
# 画像の読み込みと変換
image = Image.open(file)
image = image.convert('RGB')
output_path = os.path.join('static', 'output.jpg')
image.save(output_path, 'JPEG')
return f'<h1>変換完了!</h1><a href="/{output_path}">変換後の画像をダウンロード</a>'
変換後の画像をダウンロードさせる方法
変換後の画像をユーザーがダウンロードできるようにするために、変換処理の後に画像へのリンクを表示します。
上記のコードでは、static
フォルダに保存したoutput.jpg
へのリンクを生成しています。
ユーザーはこのリンクをクリックすることで、変換後の画像をダウンロードできます。
このようにして、Flaskを使った画像変換Webアプリケーションを作成し、ユーザーがアップロードした画像をJPG形式に変換し、ダウンロードできるようにすることができます。
まとめ
この記事では、PythonのPillowライブラリを使用してPNG形式の画像をJPG形式に変換する方法について詳しく解説しました。
具体的には、画像の読み込みからRGBモードへの変換、JPG形式での保存、さらには複数ファイルの一括変換や画像のリサイズ、Webアプリケーションでの画像変換の実装方法までを紹介しました。
これらの知識を活用して、実際のプロジェクトや日常の画像処理に役立ててみてください。