最近のiPhoneで写真を撮ると、デフォルトでHEIC形式になってしまい、windowsで編集したり不都合です。また、windowsに写真をコピーしてくると更新日時が撮影日と異なってしまい不便です。
結果的には、googleフォトにiPhoneからアップロードして、windows端末で写真をダウンロードするとjpeg形式になりました。
ただし、罠があってダウンロードした写真はjpeg形式にもかかわらず、拡張子はHEICでした。(2021.12.7時点。2021.12.29時点で修正されていました。)
このため、拡張子を手動でjpgに変更する必要がありました。
IrfanViewビューアは、拡張子の不正を見抜いていてアクセス時に、拡張子を修正しますか?と問われるので修正することが出来ます。
googoleフォトからダウンロードした写真の日付(更新日時)を撮影日時に合わせる。
googleフォトからダウンロードした写真は、作成日は撮影日時であるものの、更新日時がダウンロード日に変更されます。このため、ビューワーでの並び順に不都合が生じます。
更新日時を撮影日時に修正するには、F6Exifというソフトが便利でした。
http://www.ryouto.jp/f6exif/table09.html
ツールメニューのファイル日付復元を使います。
USBケーブルでiphoneからコピーした場合も更新日時がメチャクチャなので、同様の処理が必要です。
ちなみに、動画はF6Exifでは日付を直してくれないので、自作pythonプログラムで対応。
写真を日付が入ったフォルダに振り分けるのには、yocchiさんのデジコピー(DigiCopy)というソフトが便利ですが、検索出来ず、現在公開していないのでしょうか。
pythonでjpegの日付修正を行う。
動画での修正方法が分かったので、制止画でもプログラムが作成できた。
exif一覧をexifreadで取得し、os.utimeを使って、ファイルの日付を修正する方法です。画像自体には手を加えないので劣化しません。
iphoneの写真で動作確認していますが、ほかのデジカメやアンドロイドのExifタグは確認していないので、'Image DateTime'が無いときは代わりの文字列を使う必要があります。
Sony NEX5でも動作確認OK
import exifread #写真のEixfデータを読み込む
import glob
import os
import datetime
#jpg形式の写真を置くフォルダ。動画編集の流れでffmpegのフォルダになっているが、どこでも良い。バックスラッシュ2個はwindowsのとき
original_jpeg_file_folder="D:\\temp_ffmpeg\\original_jpeg\\*.jpg"
original_jpeg_files = glob.glob(original_jpeg_file_folder)
def kousin_time_set(my_time,out_mov_file):
# この関数、もう少しスマートな描き方があると思うが、、
my_time=str(my_time)#辞書形式のデータは添え字アクセス出来ないので文字列に変換
y=int(my_time[0:4])
m=int(my_time[5:7])
d=int(my_time[8:10])
h=int(my_time[11:13])
min=int(my_time[14:16])
s=int(my_time[17:19])
atime = datetime.datetime(year=y, month=m, day=d, hour=h, minute=min, second=s, microsecond=0)
print(y,m,d,h,min,s)#確認のため表示
#os.utimeを使うことで、ファイルの更新日時を修正できる。タイムゾーンは指定しないとデフォルト(+0900)として扱われる。
os.utime(path=out_mov_file,times=(atime.timestamp(),atime.timestamp()))
# リストとして得られているJPGファイル一覧から1つずつ取り出して、処理していく。
for original_jpeg_file in original_jpeg_files:
# Open image file for reading (must be in binary mode)
f = open(original_jpeg_file, 'rb')
# Return Exif tags 辞書形式のデータが戻ってくる
tags = exifread.process_file(f)
print(original_jpeg_file)
my_time=tags['Image DateTime']#辞書形式のデータの中から時間の部分を抽出
kousin_time_set(my_time,original_jpeg_file)
pythonでHEIC形式からJPEG形式への変換を行う。
pythonのライブラリ pyheif を使えば、変換が出来る。ただし、windows上のpythonでは現状動かないので、WSL2やgoogole colabを利用。
ちなみに、pyheifに拡張子だけHEICのファイルを食わせると、「ValueError: Input is not a HEIF/AVIF file」といわれる。
colab上だとマジックコマンド%でライブラリをインストール
%pip install --upgrade pip
%pip install pyheif
%pip install PIL
その後、以下のコマンドで指定フォルダ内のHEICファイルをすべてJPEG形式に変換
from PIL import Image
import pyheif
def conv(image_path):
new_name = image_path.replace('HEIC', 'jpg')
heif_file = pyheif.read(image_path)
data = Image.frombytes(
heif_file.mode,
heif_file.size,
heif_file.data,
"raw",
heif_file.mode,
heif_file.stride,
)
data.save(new_name, "JPEG")
import glob
lst = glob.glob("//content/drive/MyDrive/test/*.HEIC")
for l in lst:
conv(l)
以下のサイトを参考にしました。