[Python] png形式をjpg形式に変換する方法

PythonでPNG形式の画像をJPG形式に変換するには、Pillowライブラリを使用します。

PillowはPythonの画像処理ライブラリで、インストールはpip install Pillowで行います。

変換の際には、まずPNG画像をImage.open()で読み込み、次にconvert('RGB')でRGBモードに変換し、最後にsave()メソッドでJPG形式で保存します。

PNGは透過情報を持つことがあるため、JPGに変換する際は透過部分が白などで埋められます。

この記事でわかること
  • Pillowライブラリのインストール方法
  • PNGからJPGへの変換手順
  • 画像のリサイズとフォーマット変換
  • Flaskを使ったWebアプリの作成
  • 画像変換時の注意点と対策

目次から探す

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形式に変換し、ダウンロードできるようにすることができます。

よくある質問

透過PNGをJPGに変換すると背景が黒くなるのはなぜ?

透過PNGをJPG形式に変換すると、JPGが透過をサポートしていないため、透過部分が黒く表示されることがあります。

これは、PNGの透過情報が失われ、背景が黒として扱われるためです。

この問題を避けるためには、変換前に透過部分を白や他の色で埋める処理を行う必要があります。

変換後のJPG画像の画質を調整する方法は?

JPG形式は圧縮形式であり、圧縮率を調整することで画質を変えることができます。

Pillowを使用する場合、saveメソッドquality引数を指定することで画質を調整できます。

例えば、image.save('output.jpg', 'JPEG', quality=95)のように設定することで、画質を95%に保つことができます。

画質を高く設定するほど、ファイルサイズも大きくなります。

画像のメタデータは変換後も保持される?

JPG形式に変換する際、元のPNG画像に含まれるメタデータ(EXIF情報など)は通常保持されません。

JPG形式は圧縮されるため、メタデータが失われることが一般的です。

ただし、Pillowを使用してメタデータを手動でコピーすることも可能ですが、通常は変換後のJPG画像にはメタデータが含まれないと考えておくべきです。

まとめ

この記事では、PythonのPillowライブラリを使用してPNG形式の画像をJPG形式に変換する方法について詳しく解説しました。

具体的には、画像の読み込みからRGBモードへの変換、JPG形式での保存、さらには複数ファイルの一括変換や画像のリサイズ、Webアプリケーションでの画像変換の実装方法までを紹介しました。

これらの知識を活用して、実際のプロジェクトや日常の画像処理に役立ててみてください。

  • URLをコピーしました!
目次から探す