WSLでHEIC一括変換

iPhoneをはじめとするモバイルデバイスで標準採用されているHEIC(High Efficiency Image File Format)は、高画質な画像を従来のJPEGの半分程度の容量で保存できる非常に合理的な規格です。しかし、この利便性をWindows 11環境で享受しようとすると、OS標準の「フォト」アプリが有料アドオン(HEVCビデオ拡張機能)の購入を促してくるという壁に直面します。

かつては「デバイス製造元からの無料版」をインストールする回避策が広く知られていましたが、2026年現在、ライセンスチェックの厳格化により、多くの環境でインストールが弾かれるようになっています。このOS側の制約に対し、特定の企業や広告が表示される不透明なフリーソフトに頼らず、Windows Subsystem for Linux(WSL)を活用して自力で解決を試みることが、本稿の出発点です。

目次

コスト0円で実現するクリーンな変換環境

本記事の目的は、WSL上のLinux環境に備わっているオープンソースのライブラリ(libheif)を導入し、HEICファイルをJPEG形式へ一括変換する完全にローカルな環境を構築することです。外部のオンライン変換サービスを利用せず、すべての処理をローカルのPC内で完結させることで、プライバシーの保護と作業の高速化を同時に実現します。

heic to jpeg

有料化の壁と不透明なフリーソフト

現在、多くのWindowsユーザーが直面している課題は、HEICという一般的な画像形式を扱うために、少額とはいえ課金を強いられるという不条理です。これに対し、安易に「無料変換ソフト」を検索して導入することは推奨されません。それらの多くはソースコードが公開されていない不透明なバイナリであり、不要な広告表示や、最悪の場合はマルウェアのリスクを孕んでいる可能性があるからです。

また、Web上の変換サービスは、個人の写真を外部サーバーにアップロードするという致命的なセキュリティ上の懸念があります。OSの仕様という「枠組み」が機能しないのであれば、信頼できるオープンソースの技術を使い、自分だけの安全な環境を構築する必要があります。

WSLにlibheifをインストール

これらの課題を解決する、最も無駄を削ぎ落とした手法を提示します。まず、WSL(Ubuntu等)に変換エンジンをインストールします。

sudo apt update && sudo apt install -y libheif-examples

失敗したワンライナー

一括変換を自動化しようとする際、多くのユーザーが最初に思いつくのは find コマンドの結果を for 文で回す手法です。しかし、ここにはシェルスクリプト特有の落とし穴が存在します。

失敗するスクリプトの例

この記述を実行すると、ファイル名にスペースが含まれている場合(例:「IMG_6970 – コピー.HEIC」)、以下のようなエラーが発生します。

[code lang=bash]Input file is not an HEIF/AVIF file

失敗の原因:単語分割(Word Splitting)

この失敗の理由は、シェルの「単語分割」という挙動にあります。$(find …) の実行結果を展開する際、シェルはスペースを「データの区切り」と見なします。その結果、「IMG_6970 – コピー.HEIC」という一つのファイル名が、「IMG_6970」「-」「コピー.HEIC」という3つの独立した引数として分割され、変換コマンドに渡されてしまいます。存在しない断片的なファイル名を渡されたコマンドは、当然ながらエラーを返します。

これを解決するために環境変数 IFS(内部フィールド区切り文字)を操作する手法もありますが、一行でスマートに記述するには少々煩雑です。

成功したワンライナー

対象の画像があるディレクトリへ移動し、以下のワンライナーを実行します。

for i in ./*.{HEIC,heic}; do heif-convert "$i" "${i%.*}.jpg"; done

この一行には、実用性を重視した以下の技術的判断が込められています。

  1. シェルの展開の活用: $(find) 等を使わず、シェル自身にファイルリストを作成させることで、ファイル名に含まれる「スペース」の問題をスマートに回避しています。
  2. ブラケット展開: .{HEIC,heic} と記述することで、大文字・小文字どちらの拡張子も一度に処理対象に含めます。
  3. 最小限のコード: 万が一該当ファイルが存在しない場合、変換コマンドはエラーを出力しますが、実用上の支障はありません。コードの短さと可読性を最優先し、過剰な条件分岐を排除しています。
  4. パラメータ展開: “${i%.*}.jpg" を用いることで、元のファイル名から拡張子のみを正確に剥離し、新しい拡張子を付与します。

まとめ

Windows 11におけるHEIC表示の問題は、単なるソフトウェアの不備ではなく、プラットフォームのライセンス戦略がユーザーの利便性を損なっている一例です。しかし、WSLという強力な環境を介してOSSを導入し、適切な一行のスクリプトを記述することで、これらの制約は容易に無効化できます。

今回の課題は、「コマンド実行結果の展開時における単語分割によって、スペースを含むファイル名が正しく扱えない」というシェルの仕様に起因するものでした。これを、「シェル自身のパス展開(Globbing)を直接利用し、ダブルクォートで適切に保護する」という手法により、最小限の記述で解決しました。