こんにちは!

5/17(金)は、前職場の飲み会に招待頂きました。
場所は、大田区蒲田になります。
会の開始時間よりも早くに現着したので、JR蒲田駅周辺を軽く散策しました。
昭和感満載の立ち飲みのお店が沢山あります。


さてと、今回はJPEGとPNGとの違いについて書きます。
それぞれの詳細な説明は、

を参照願います。
両者の違いは、

を参照願います。
見た目の顕著な差は、

PNGは、透明な背景をサポート

です。ここでは、PNGからGIFのぱらぱらアニメーションを作ってみたいと思います。
以下は、そのPythonスクリプトになります。

上差し用いたPNGファイル群

# 本スクリプトと出力ファイルは、カレントフォルダ
from PIL import Image
import os

# 連番の静止画像が保存されているフォルダ
input_folder = './splitted'

# file タイプ
f_type = 'png'

# 出力するGIFアニメーションのファイル名
output_filename = "anime.gif"
# アニメーションの速度(ミリ秒単位)
duration = 1000  # 100ミリ秒 = 0.1秒
       
def create_gif_from_images():

    # 画像、パラメータ選択
    if f_type == 'png':
      print('PNG')
      i_type = 'RGBA'
    elif f_type == 'jpg':
      print('JPEG')
      i_type = 'RGB'
    else:
      print('No matched file type.')
  
    image_files = sorted([f for f in os.listdir(input_folder) if f.endswith('.' + f_type)],reverse= False)
    if not image_files:
        print("No images found in the specified folder.")
        return

    # 画像を読み込んでリストに追加
    images = [Image.open(os.path.join(input_folder, img)).convert(i_type) for img in image_files]
    
    # GIFアニメーションを作成
    images[0].save(output_filename+'.gif', save_all=True, append_images=images[1:], duration=duration, loop=0)
    print(f"GIFアニメーションを {output_filename} に保存しました。")

if __name__ == '__main__':
    create_gif_from_images()
###
以上のスクリプトから、生成されたGIFファイルですが、

になります。右差し 12種のPNGファイルを重ねていくのですが、各PNGファイルの背景が透明なために、背景部分に先の画像が残って上書きされて行きます。

 

で紹介したアニメーションですが、PNGファイルをJPEGに変換する際に背景の透明な部分を“白色”に変換しています。

PNG→JPEG変換のPythonのスクリプトは、
###
from PIL import Image
import os

r = 255
g = 255
b = 255
# 透明度の設定0: 100%透過, 255: 不透過
a = 255

def convert_png_to_jpg(input_folder, output_folder):
    # 元のフォルダー内の全ての.pngファイルを取得
    file_list = [file for file in os.listdir(input_folder) if file.endswith(".png")]

    for file_name in file_list:
        # 画像を開く
        image = Image.open(os.path.join(input_folder, file_name))
        # 透明部分を変換
        image = image.convert("RGBA")
        data = image.getdata()
        new_data = [(r, g, b, a) if item[3] == 0 else item for item in data]
        image.putdata(new_data)
        # JPEG形式に変換
        image = image.convert("RGB")
        # 保存ファイルパスを作成
        output_path = os.path.join(output_folder, file_name.replace(".png", ".jpg"))
        # 画像を保存
        image.save(output_path)
        
# 使用例
input_folder = "./"  # 変換する元の画像フォルダー
output_folder = "./"  # 変換した画像を保存するフォルダー
convert_png_to_jpg(input_folder, output_folder)
###
となります。
r = g = b = 255の時は、背景が白
r = g = b = 0の時は、背景が黒

ではでは