Windows11でHEIC画像からスライドショー動画を作る

# 目的
Windows11でHEIC画像からスライドショー動画を作る

<iframe width="560" height="315" src="https://www.youtube.com/embed/s20wbAmxLZU?si=yu4D3Hq5Z2RFe2BQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 背景
iPhoneで撮った写真HEICファイル(iOSデバイスのデフォルトの画像形式)をWindows11で受け取ることがある。Windows11でHEIC画像からスライドショー動画を作ろうと思ったら色々苦労したのでメモする。

- Windows11で、HEICファイルをフォトアプリで読み込めたが、スライドショー動画はエラーで作られなかった
- Windows11で、HEICファイルに対応している無料アプリが見つからない
- Windows11で、HEICファイルに対応していそうな無料アプリでも、画像の一部分しか読み込まないことがある
  - shotcut version24.11.17 [要望](https://forum.shotcut.org/t/heic-file-format-support/17817)がcloseされていないので、まだ未対応かも

# 概要
私の知るところでは、Windows11でHEICファイルからスライドショー動画を作られる無料アプリが見つからなかった。
JPEGからは作られるので、HEICからJPEGを作る以下の二つの方法を紹介する。
1. ImageMagickでHEICをJPEGに変換してから、スライドショー動画作成アプリで使う
1. PythonライブラリimagecodecsでHEICをJPEGに変換してから、スライドショー動画作成アプリで使う

JPEGであれば、どんなスライドショー動画作成アプリでも良いと思うが、今回はshotcutを使う。
※HEICからJPEGを作るとビットの深さが落ちて画像は劣化する
※imagecodecsではEXIF情報をコピーしていないので情報が空欄になる
左：HEIC、中：ImageMagickデフォルト変換JPEG、右：imagecodecsデフォルト変換JPEG
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/cfc86cda-4403-47a5-e2bc-92a130573d2f.png)
サイズは、ImageMagicだと2倍ほどに増えて、imagecodecsだと1割ほど減っていた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/7e4ead3f-ac24-bd67-1f6b-20abab3a53f3.png)


# 1. ImageMagickでHEICをJPEGに変換する手順
## セットアップ前環境
- Windows11 バージョン24H2(OSビルド26100.2605)
  - chocolatey v2.3.0
※chocolateyについては以下の記事が参考になる
[Chocolateyを使ってパッケージを管理する](https://qiita.com/fuk101/items/f5245b741e236cc9c13f)

## セットアップ
- Windowsキーを押す
- 検索ボックスに「cmd」と入力
- Ctrl + Shift + Enterを押す(管理者として実行)
- 以下のコマンドを実行する(途中選択肢が出る場合は、A + Enterする)
```commandline:cmd.exe（管理者として実行）
choco upgrade chocolatey
choco install imagemagick
choco install shotcut
```

## セットアップ後環境
- Windows11 バージョン24H2(OSビルド26100.2605)
  - [chocolatey v2.4.1](https://community.chocolatey.org/packages/chocolatey)
  - [ImageMagick 7.1.1.4300](https://community.chocolatey.org/packages/ImageMagick)
  - [shotcut version 24.11.17](https://community.chocolatey.org/packages/Shotcut)

## 使い方
以下のコマンドで、カレントフォルダのheicファイルからjpgファイルを生成する
```commandline:cmd.exe
magick mogrify -format jpg *.heic
```
生成したjpgファイルを使って、以下の記事を参考にスライドショー動画を作成する
[Shotcutで画像スライドショー動画（BGM付き）を作成](https://adbird.hatenablog.com/entry/2020/07/10/232437)

# 2. PythonライブラリimagecodecsでHEICをJPEGに変換する手順

## セットアップ前環境
- Windows11 バージョン24H2(OSビルド26100.2605)
  - chocolatey v2.3.0
※chocolateyについては以下の記事が参考になる
[Chocolateyを使ってパッケージを管理する](https://qiita.com/fuk101/items/f5245b741e236cc9c13f)


## セットアップ
- Windowsキーを押す
- 検索ボックスに「cmd」と入力
- Ctrl + Shift + Enterを押す(管理者として実行)
- 以下のコマンドを実行する(途中選択肢が出る場合は、A + Enterする)

```commandline:cmd.exe（管理者として実行）
choco upgrade chocolatey
choco install python
choco install pycharm-community
choco install visualstudio2022buildtools
choco install visualstudio2022-workload-vctools
choco install shotcut
```

[GitHub vcpkg](https://github.com/Microsoft/vcpkg)から、zipをダウンロードして展開する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/2ddba230-bbc2-5e4d-3008-0eb627b88157.png)
またはクローンする
```commandline:cmd.exe
git clone https://github.com/Microsoft/vcpkg.git
```
展開フォルダでコマンドプロンプトを開き、以下のコマンドを入力する
```commandline:cmd.exe
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
.\vcpkg install libde265:x64-windows
.\vcpkg install x265:x64-windows
.\vcpkg install libheif:x64-windows
pip install pillow
pip install pyheif
```


ここで以下のエラーが出るなら、chocolatyでvisualstudio2022buildtoolsがきちんと入ってないかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/64b790f6-787f-c216-7449-b292afd7571e.png)
以下のパスにあるインストーラーを起動してインストール済みか確認する
```
C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe
```
以下はインストール済みの状態。インストール済みになっていない場合は、 この記事「[「Microsoft Visual C++ 14.0 or greater is required.」が出た場合の対処方法](https://self-development.info/%E3%80%8Cmicrosoft-visual-c-14-0-or-greater-is-required-%E3%80%8D%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/#google_vignette)」を参考にインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/2a9400b4-2571-14d9-c8da-f03a259aeb3d.png)

インポートに成功するが、実行時に以下のエラーがでる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/0fedd981-8a59-26db-3f5d-c2e51d4ab4f7.png)
_libheif_cffiは存在するように見える？(Python仮想環境管理のパスが.venv2の場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/f4471915-be07-0c07-7bf7-21340b335d4f.png)

vcpkgでビルドされて、以下のファイルが配置されているので
```
D:\git\vcpkg\packages\libheif_x64-windows\bin\heif.dll
D:\git\vcpkg\packages\libheif_x64-windows\lib\heif.lib
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_cxx.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_items.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_plugin.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_properties.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_regions.h
D:\git\vcpkg\packages\libheif_x64-windows\include\libheif\heif_version.h

D:\git\vcpkg\packages\libde265_x64-windows\bin\libde265.dll
D:\git\vcpkg\packages\libde265_x64-windows\lib\de265.lib
D:\git\vcpkg\packages\libde265_x64-windows\include\libde265\de265.h
D:\git\vcpkg\packages\libde265_x64-windows\include\libde265\de265-version.h
D:\git\vcpkg\packages\libde265_x64-windows\include\libde265\en265.h

D:\git\vcpkg\packages\x265_x64-windows\bin\libx265.dll
D:\git\vcpkg\packages\x265_x64-windows\lib\libx265.lib
D:\git\vcpkg\packages\x265_x64-windows\include\x265.h
D:\git\vcpkg\packages\x265_x64-windows\include\x265_config.h
```
以下に従い
- [pip install pyheif doesnt work on windows #2](https://github-com.translate.goog/carsales/pyheif/issues/2?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc#issuecomment-886469620)

以下のdllだけ.venv2/Scripts以下に配置した(Python仮想環境管理のパスが.venv2の場合)
```
D:\git\vcpkg\packages\libheif_x64-windows\bin\heif.dll
D:\git\vcpkg\packages\libde265_x64-windows\bin\libde265.dll
D:\git\vcpkg\packages\x265_x64-windows\bin\libx265.dll
```

すると、以下のエラーに変わったので
- ImportError: No module named _cffi_backend

以下に従い
- [No module named _cffi_backend](https://stackoverflow.com/questions/34370962/no-module-named-cffi-backend)

cffiを入れなおした
```commandline:cmd.exe
pip uninstall cffi
pip install cffi
```
動き出したが、以下のエラーになった
```
変換エラー: struct heif_decoding_options: wrong total size (cdef says 72, but C compiler says 80). fix it or use "...;" as the last field in the cdef for struct heif_decoding_options to make it flexible: C:\Users\igapon\Downloads\1229\025.heic
```

以下と同じ状況のようだ、回避策が提案されているが、ここまでにして、imagecodecsを使うことにする
- [Struct heif_decoding_options: wrong total size #92](https://github-com.translate.goog/carsales/pyheif/issues/92?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc)

以下を実行する
```commandline:cmd.exe
pip install imagecodecs
```

## セットアップ後環境
- Windows11 バージョン24H2(OSビルド26100.2605)
  - [chocolatey v2.4.1](https://community.chocolatey.org/packages/chocolatey)
  - [Python3.13.1](https://community.chocolatey.org/packages/python/3.13.1)
  - [PyCharm-Community 2024.3.1.1](https://community.chocolatey.org/packages/pycharm-community)
  - [Visual Studio 2022 Build Tools 117.12.2](https://community.chocolatey.org/packages/visualstudio2022buildtools)
  - [Visual C++ build tools workload for Visual Studio 2022 Build Tools 1.0.0](https://community.chocolatey.org/packages/visualstudio2022-workload-vctools)
  - [shotcut version 24.11.17](https://community.chocolatey.org/packages/Shotcut)

## 使い方
[GitHub](https://github.com/igaponr/training/blob/1.12.0/python/Web_scraping/helper/heic2jpg.py)を、HEICファイルがあるフォルダにダウンロードして以下を実行する
```commandline:cmd.exe
python heic2jpg.py
```
HEICファイルがあるフォルダを引数で指定する場合は以下の通り実行する
```commandline:cmd.exe
python heic2jpg.py -p "C:\Users\igapon\Downloads\1229\heic"
```

生成したjpgファイルを使って、以下の記事を参考にスライドショー動画を作成する
[Shotcutで画像スライドショー動画（BGM付き）を作成](https://adbird.hatenablog.com/entry/2020/07/10/232437)


# おわりに
PythonにHEIC向けライブラリがあるので、Windows11でも簡単に対応できると思って取り組み始めたが、とても苦戦した。現時点ではImageMagickを使うのが楽だと思う。

# 関連リンク
## 参考サイト
- [Shotcutで画像スライドショー動画（BGM付き）を作成](https://adbird.hatenablog.com/entry/2020/07/10/232437)
- [Chocolateyを使ってパッケージを管理する](https://qiita.com/fuk101/items/f5245b741e236cc9c13f)
- [【python】pip installの際に「error: Microsoft Visual C++ 14.0 is required」が発生した場合の対応方法](https://tech.nkhn37.net/python-pip-install-error-microsoft-visual-c-14/)
- [「Microsoft Visual C++ 14.0 or greater is required.」が出た場合の対処方法](https://self-development.info/%E3%80%8Cmicrosoft-visual-c-14-0-or-greater-is-required-%E3%80%8D%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/#google_vignette)
- [vcpkgを使ってみた](https://qiita.com/jugemjugemu/items/fcb72bdca13dc06b0f37)
- [vcpkg を用いた Win/Mac/Linux用 c++プログラムの cmake ＆ vscode 実行例](https://zenn.dev/tenka/articles/use_vcpkg_and_cmake)
- [pip install pyheif doesnt work on windows #2](https://github-com.translate.goog/carsales/pyheif/issues/2?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc#issuecomment-886469620)
- [No module named _cffi_backend](https://stackoverflow.com/questions/34370962/no-module-named-cffi-backend)
- [HEIF(HEIC)ファイルの読み書き実装](https://qiita.com/devmynote/items/ab9fbf8d27089660c00c)

## 関連GitHub
- [vcpkg](https://github.com/Microsoft/vcpkg)
- [strukturag/libheif](https://github.com/strukturag/libheif)

## ドキュメント
- [vcpkgのドキュメント](https://learn.microsoft.com/ja-jp/vcpkg/)