画像処理プログラムを作成しております
以下コードをjupiter notebookで実行し、画像処理を行うプログラムを作成中です。
python
1import os 2import sys 3import shutil 4from datetime import datetime 5from enum import Enum, auto 6 7import tkinter, tkinter.filedialog 8from PIL import Image 9 10#FACE_ICON_FILE = 'smile.png' #アイコン画像 11WM_FILE = 'logo.png' #ウォーターマーク画像 12 13class Mode(Enum): 14 BLG = auto() #ブログ用 15 16def mkdir_dto(img, output_dir_path): 17 """画像の撮影日のフォルダを作成する 18 :param img: 画像(PIL) 19 :param output_dir_path: 出力先のフォルダーのパス 20 :return: 作成したフォルダーのパス 21 """ 22 EXIF_DTO = 36867 #Exifの撮影日のタグ番号 23 24 # 移動先フォルダー作成。フォルダー名はExifの撮影日からyyyymmdd形式で生成 25 exif = img._getexif() 26 dt = datetime.strptime(exif[EXIF_DTO], '%Y:%m:%d %H:%M:%S') 27 output_sub_dir = dt.strftime('%Y%m%d') 28 output_path = os.path.join(output_dir_path, output_sub_dir) 29 os.makedirs(output_path, exist_ok=True) 30 31 return output_path 32 33def make_img(img, img_name, mode, watermark, output_path): 34 """画像をリサイズし、ウォーターマークを貼り付け、別名で保存する 35 :param img: 画像(PIL) 36 :param img_name: 画像(PIL)ファイル名 37 :param mode: Mode.BLGならブログ用、Mode.TMBならサムネイル用 38 :param watermark: ウォーターマーク画像(PIL) 39 :param output_path: 出力先フォルダーのパス 40 """ 41 BLG_CHAR = '_s' #ブログ画像のファイル名に付加する文字列 42 MAX_W_BLG = 3600 #ブログ画像の幅の上限 43 MAX_H_BLG = 3600 #ブログ画像の高さの上限 44 45 # サイズ、ファイル名の末尾に付加する文字列を設定 46 if (mode == Mode.BLG): #ブログ用 47 w, h = MAX_W_BLG, MAX_H_BLG 48 add_chr = BLG_CHAR 49 else: 50 return None 51 52 #リサイズ 53 img.thumbnail((w, h)) 54 55 #ウォーターマークを付加 56 w_img, h_img = img.size 57 w_wm, h_wm = watermark.size 58 img.paste(watermark, (w_img - w_wm-180, h_img- h_wm-110), watermark)#ロゴの程良い位置を右下から(x,y)=(-180,-120)として座標を決定してます 59 60 #ファイル名に文字列を付加して保存 61 fname, ext = os.path.splitext(img_name) 62 img.save(os.path.join(output_path, fname + add_chr + ext), quality=95,) 63 64 65# 顔アイコン画像とウォーターマーク画像読み込み 66 67watermark = Image.open(WM_FILE) 68 69#元画像フォルダー選択 70root = tkinter.Tk() 71root.withdraw() 72msg = '画像フォルダーを選択してください。' 73img_dir_path = tkinter.filedialog.askdirectory(title=msg) 74if (not img_dir_path): #[キャンセル]クリック時の処理 75 print('フォルダーを選んでください。') 76 sys.exit() 77 78#出力先フォルダー選択 79msg = '出力先フォルダーを選択してください。' 80output_dir_path = tkinter.filedialog.askdirectory(title=msg) 81if (not output_dir_path):#[キャンセル]クリック時の処理 82 print('フォルダーを選んでください。') 83 sys.exit() 84 85# 元画像フォルダー内のファイル1つずつ処理 86for img_file in os.listdir(img_dir_path): 87 #元画像読み込み (PIL) 88 img_path = os.path.join(img_dir_path, img_file) 89 img_pil = Image.open(img_path) 90 91 92 #ファイルの移動先フォルダー作成 93 output_path = mkdir_dto(img_pil, output_dir_path) 94 95 #ブログ用画像とサムネイル用画像を作成 96 make_img(img_pil.copy(), img_file, Mode.BLG, watermark, output_path) 97 98 #元画像(PIL)を閉じる 99 img_pil.close()
直面している問題
上記コードは問題なく動作するのですが、pillowの仕様なのか書き出された画像から一切のExifデータが削除されてしまいます。複数のカメラマンに撮ってもらった大量の写真データを時系列に並べて管理するということを実現したいため、Exifデータを消したくありません。
python
1 img.save(os.path.join(output_path, fname + add_chr + ext), quality=95,)
この行になにか付け加えればExifデータを保持したまま画像を作ることができるのでしょうか?それとも何か他の方法があるのでしょうか?
お手数おかけしますが、ご教授いただければ幸いです。
回答2件
あなたの回答
tips
プレビュー