HEIC形式の画像（iPhoneなど）をJPGに変換したい。ファイルの日付も撮影日にしたい。

最近のiPhoneで写真を撮ると、デフォルトでHEIC形式になってしまい、windowsで編集したり不都合です。また、windowsに写真をコピーしてくると更新日時が撮影日と異なってしまい不便です。

結果的には、googleフォトにiPhoneからアップロードして、windows端末で写真をダウンロードするとjpeg形式になりました。
ただし、罠があってダウンロードした写真はjpeg形式にもかかわらず、拡張子はHEICでした。（２０２１．１２．７時点。2021.12.29時点で修正されていました。）

このため、拡張子を手動でjpgに変更する必要がありました。
IrfanViewビューアは、拡張子の不正を見抜いていてアクセス時に、拡張子を修正しますか？と問われるので修正することが出来ます。

## googoleフォトからダウンロードした写真の日付（更新日時）を撮影日時に合わせる。
googleフォトからダウンロードした写真は、作成日は撮影日時であるものの、更新日時がダウンロード日に変更されます。このため、ビューワーでの並び順に不都合が生じます。
更新日時を撮影日時に修正するには、F6Exifというソフトが便利でした。
http://www.ryouto.jp/f6exif/table09.html
ツールメニューのファイル日付復元を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/2a350907-cbd7-ca59-087a-7bbe1c8b9cf3.png)


USBケーブルでiphoneからコピーした場合も更新日時がメチャクチャなので、同様の処理が必要です。
ちなみに、動画はF6Exifでは日付を直してくれないので、自作pythonプログラムで対応。

https://qiita.com/katakaku/items/55c6167ab0ab9afb786b

写真を日付が入ったフォルダに振り分けるのには、yocchiさんのデジコピー(DigiCopy)というソフトが便利ですが、検索出来ず、現在公開していないのでしょうか。

## pythonでjpegの日付修正を行う。
動画での修正方法が分かったので、制止画でもプログラムが作成できた。
exif一覧をexifreadで取得し、os.utimeを使って、ファイルの日付を修正する方法です。画像自体には手を加えないので劣化しません。
iphoneの写真で動作確認していますが、ほかのデジカメやアンドロイドのExifタグは確認していないので、'Image DateTime'が無いときは代わりの文字列を使う必要があります。
Sony NEX5でも動作確認OK

```py
import exifread #写真のEixfデータを読み込む
import glob
import os
import datetime

#ｊｐｇ形式の写真を置くフォルダ。動画編集の流れで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)
```

以下のサイトを参考にしました。

https://qiita.com/tomoyk/items/c2a85dced32c08aca209

https://pypi.org/project/pyheif/