【Pythonで画像/動画変換】HEIC/MOVファイルを、JPG/MP4ファイルに一括変換


# はじめに
iPhone/iPadでカメラ・ビデオ撮影しているといつのまにか端末のストレージが一杯になっていることはありませんか？せっかく撮影したものですからバックアップしておきたいものです。

iPhone/iPadにて撮影したたくさんの画像や動画データをクラウドストレージにアップするのではなく、HDDの容量が安価で豊富に準備できるWindows PC上でファイルを管理する方法を紹介していきたいと思います。

![file_icon_text_jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598548/5c95a22b-171a-645f-af67-020d5586b123.png)![file_icon_text_mp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598548/da939ca2-bc0b-9e5a-1f50-fbf330a7873d.png)


# Phone/iPadからWindowsPCに画像・動画データーの移動方法
iPhone/iPadからWindowsにデータを移動する方法はいろいろありますが、とても容量が大きい動画ファイルはクラウドストレージ経由でもコピーできない場合があります。

iPhone/iPadをWindowsPCにライトニングケーブル等でUSB接続すると容量が大きな画像データ/動画データでもコピーすることはできます。

- iPhone/iPadの[設定]-[写真]を選択し、[MACまたはPCに転送]の設定を[元のフォーマットのまま]を選択しておきます
  - 動画ファイルなど大きなデータを転送中にエラーになることが少なくなります
- iPhone/iPad をUSBでWindowsPCに接続
- iPhone/iPad の画面上で「信頼する」を選択
- WindowsPCにAppleデバイスが認識されます
- フォルダを開いてファイルを全選択してコピーし、コピー先のフォルダにペーストします


# 画像・動画データーの一括変換

Apple社の独自フォーマット(HEIC/MOV)ファイルはそのままではWindows上で表示・再生できませんので、Windowsでも表示・再生できる形式(JPG/MP4)に一括変換するpythonを使った方法です。
また、ファイル名を分かりやすく、撮影日時に変換する方法を紹介します。

| 例   | iPhone/iPad上の元データ形式 | Windows上で変換後のデータ形式 |
|----|----|----|
|  写真 |  IMG_5902.JPG |  2019-08-13 11.23.45.JPG |
|  写真 |  IMG_6797.HEIC|  2019-11-12 15.11.23.JPG |
|  写真 |  IMG_4975.PNG |  2021-02-23 15.23.45.JPG |
|	|	|	|
|  動画 |  IMG_3386.MOV |  2021-03-15 08.24.13.MP4 |

# JPG -> JPG変換
  - JPGはWindowsでも表示できますのでデータ形式の変換不要です
  - ファイル名変換は後記します

# HEIC -> JPG変換

- magick.exeを使用させていただきます。
  - 以下からWindows版をダウンロードしインストールします
  - http://www.imagemagick.org/script/download.php
  - iPhone/iPadからデータをコピーしたフォルダ上で以下のpythonを実行します


```python
import os
import subprocess

for root, dirs, files in os.walk("./"):
	for file in files:
		ext = os.path.splitext(file)[1]
		ext = ext.lower()
		if ".heic" in ext:
			jpg = os.path.splitext(file)[0] + ".jpg"
			print("magick.exe convert \""+file+"\" \""+jpg+"\"")
			subprocess.run("magick.exe convert \""+file+"\" \""+jpg+"\"", shell=True)
```

# PNG -> JPG変換
- データ形式の変換をしなくてもWindowsでも表示できます
- ですがJPG形式に揃えておきたい場合は、magick.exeを使用します
  - 以下からダウンロードしインストールします
  - http://www.imagemagick.org/script/download.php
  - iPhone/iPadからデータをコピーしたフォルダ上で以下のpythonを実行します

```python
import os
import subprocess

for root, dirs, files in os.walk("./"):
	for file in files:
		ext = os.path.splitext(file)[1]
		ext = ext.lower()
		if ".png" in ext:
			jpg = os.path.splitext(file)[0] + ".jpg"
			print("magick.exe convert \""+file+"\" \""+jpg+"\"")
			subprocess.run("magick.exe convert \""+file+"\" \""+jpg+"\"", shell=True)
```

# JPGファイル名を撮影日時に変換

- だいたいのJPGファイルにはexifという撮影日時の情報が埋め込まれていますので、その情報を使ってファイル名を変換していきます
  - まれにexifが埋め込まれていないJPGファイル場合変換できません（後日対処方法を別途紹介します）
	  - Windows上で、対象の画像ファイルを右クリックし、プロパティを選択
	  - 詳細タブを開き、撮影日時の欄　に、手動で日時を入力します

- PILライブラリを使用しますので、以下のコマンドを実行してインストールしておいてください
  - pip install Pillow

```python
import os
from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(img):
	try:
		exif = img._getexif()
		for id,val in exif.items():
			tg = TAGS.get(id,id)
			if tg == "DateTimeOriginal":
				return val
	except AttributeError:
		return "NON"
	return "NON"

def getDateTime(path):
	try:
		img = Image.open(path)
	except:
		return "NON"
	datetimeinfo = get_exif(img)
	img.close()
	return datetimeinfo

for root, dirs, files in os.walk("./"):
	for file in files:
		ext = os.path.splitext(file)[1]
		ext = ext.lower()
		if ".jpg" in ext:
			exif = getDateTime(os.path.join(root, file))
			if exif != "NON" :
				name = exif
				name = name.replace(':', '-')[:10] + name.replace(':', '.')[10:]
				if name not in file:
					if not os.path.exists(os.path.join(root, name+".jpg")):
						os.rename( os.path.join(root, file), os.path.join(root, name+".jpg") )
						print(os.path.join(root, file) + " -> " + name + ".jpg [Rename]")
			else:
				print(os.path.join(root, file) + " [Exif error]")
```


# MOV -> MP4 変換 + ファイル名を撮影日時に変換

- ffmpeg.exe を使用します。
  - 以下からWindows版ダウンロードしffmpeg.exeを実行したいフォルダにコピーします
  - https://ffmpeg.org/
  - iPhone/iPadからデータをコピーしたフォルダ上で以下のpythonを実行します

- iオプションで情報表示された中から、正規表現で撮影日時を取ってきてmp4ファイル名を作成しています

```python
import os
import subprocess
import re

def MovToMp4(path,root):
	print("ffmpeg.exe -i \""+path+"\"")
	result = subprocess.run("ffmpeg.exe -i \""+path+"\"", shell=True, stderr=subprocess.PIPE, universal_newlines=True)
	m = re.search("(?<=com.apple.quicktime.creationdate: )(.*)" , result.stderr)
	date = m.group(0)
	date = date[:-5]
	date = date.replace('T', ' ')
	date = date.replace(':', '.')
	date = date + ".mp4"
	mp4 = os.path.join(root,date)
	print("ffmpeg.exe -i \""+path+"\" \""+mp4+"\"")
	subprocess.run("ffmpeg.exe -i \""+path+"\" \""+mp4+"\"", shell=True)

for root, dirs, files in os.walk("./"):
	for file in files:
		ext = os.path.splitext(file)[1]
		ext = ext.lower()
		if ".mov" in ext:
			MovToMp4(os.path.join(root, file),root)
```

# さいごに

次回は、上記のpythonプログラムを結合したり、ファイルの整理処理や例外処理を追加したり、クラウドストレージと連携したりして、iPhone/iPadの画像/動画ファイルのWindowsへ自動バックアップを目指していきたいと思います。