LoginSignup
1
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-09

最近の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
ツールメニューのファイル日付復元を使います。
image.png

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)

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

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3