iPhone の HEIC 写真を JPG に変換する方法 (アップロード不要)
iPhone で撮った HEIC をブラウザだけで JPG / PNG に変換する手順。HEIC が他のデバイスで開けない理由と、libheif-js で復号する流れをまとめました。
なぜ HEIC は「相手の環境で開けない」を量産するか
iOS 11 以降の iPhone はカメラの保存形式に HEIC (拡張子 .heic / .HEIC) を採用していて、これは Apple の HEIF コンテナの中に HEVC (H.265) コーデックで圧縮された静止画を入れたフォーマットです。JPEG とほぼ同等の画質を半分前後のサイズで保存できるため、カメラロールの容量効率は大きく改善しました。一方で配布側に立つと話はひっくり返ります — 「写真を送ったら相手の Slack で表示されなかった」「ブログの管理画面にアップしたら拡張子ではじかれた」「メールに添付したら Windows のプレビューで真っ黒だった」という話は、HEVC のライセンス事情と OS ごとのコーデック搭載状況がそのまま噴出した結果です。
具体的にはこんな場面で詰まります — 求人サイトに証明写真をアップロードしようとしたら HEIC 非対応、保険の手続きで本人確認書類を送ろうとしたら JPEG / PNG 限定、Discord や古いバージョンの LINE / Teams のサムネイル表示で読み込めない、ブログ CMS の画像インポートが壊れる、Word / PowerPoint への貼り付けで Office のバージョンによっては失敗する。Web の世界はまだ JPEG / PNG / WebP / AVIF が事実上の標準で、HEIC は iPhone のローカルから外に出る一歩目で「変換」されることを期待されています。
ブラウザに HEIC を投げ込んで JPG にする手順
heic-convert を開き、HEIC / HEIF ファイルを 1 枚から数十枚までまとめてドラッグ & ドロップします。出力フォーマットは JPEG / PNG / WebP から選択、JPEG と WebP では品質スライダー (0〜100) が出てきます。一般的な共有用途なら品質 80 〜 90 が画質と容量のバランス点で、SNS にそのまま投稿するなら 75 でも違いはまず判別できません。読み込みが完了するとサムネイルプレビューが表示されるので、変換前に「これで合ってる」をその場で確認できます。
変換が終わると、ファイルごとに変換後サイズ・ダウンロードボタン・削除ボタンが並びます。複数枚をまとめて ZIP で受け取ることも、個別にダウンロードすることもできます。変換 JPEG をそのまま SNS や履歴書に流す前に、撮影日時・GPS・端末モデルといった EXIF を確認したい場合は出力した JPEG を image-exif-strip に通すと、残存メタデータの一覧を確認したうえで全削除できます。さらに「容量が大きすぎる」と言われた場合は image-compress で再エンコードして指定サイズに収めれば、メール添付の制限も突破できます。
libheif-js (WebAssembly) で HEVC をデコードして Canvas に書き戻す
ブラウザは HEIC を直接デコードできない (Chrome / Firefox の標準には HEVC デコーダが入っていないため) ので、このツールは libheif-js を使います。libheif は C++ で書かれた HEIF / HEVC 用のオープンソースデコーダで、それを WebAssembly にビルドしたものが libheif-js です。デコーダ本体をブラウザに持ち込むことで、OS やブラウザの HEVC 対応状況に依存せずに展開できます。WASM のロード後はオフラインでも動きます。
処理の流れはこうです — FileReader API で HEIC バイナリを ArrayBuffer として読み込む → libheif-js が HEIF コンテナ (ISO/IEC 23008-12、MP4 と同じ ISOBMFF ベース) をパースして主たる静止フレーム (primary item) の HEVC ストリームを抜き出す → HEVC をデコードして RGBA ピクセルバッファに展開 → そのバッファを <canvas> に書き戻し、canvas.toBlob(type, quality) で JPEG / PNG / WebP として再エンコード → 出力 Blob をダウンロード可能な URL にする。Canvas を経由する副作用として、HEIC 側の EXIF (GPS、撮影時刻、端末モデル) は出力ファイルから落ちます。アーカイブ目的で撮影データを残したい場合は、元の HEIC ファイルを別途バックアップする必要があります。なお HEIC ではなく通常の JPEG / PNG / WebP 間の往復変換だけなら image-convert が libheif を呼ばずに完結するので、HEIC が絡まないケースはそちらの方が軽量です。
オンライン HEIC コンバータと「写真を渡してしまう順序」
「heic to jpg online」は検索ボリュームが非常に大きく、無料の SaaS が大量に並ぶジャンルです。多くは「処理後 N 時間で自動削除」と謳いますが、削除前に内部のログ・キャッシュ・バックアップ・CDN エッジに記録されないことまでは保証していません。利用規約に「アップロードされたコンテンツをサービス改善のために利用できる」「非独占的ライセンスを許諾する」という条項が入っているケースもあり、顔・場所・端末情報を含む iPhone 写真は AI 学習素材として価値づけられています。
そもそも HEIC 変換が走る瞬間は「カメラロールから外の世界へ出す最後の処理」です。本人が選んだ送信先 (家族、友人、勤務先) に届く前に、変換 SaaS が EXIF つきフルサイズのコピーを取得してしまう構造は、本人の意図とずれます。ブラウザ内の heic-convert は libheif-js / Canvas / Blob 出力だけで完結し、ソースは GitHub で公開されています。DevTools の Network タブを開いた状態で変換 → ZIP ダウンロードを最後まで走らせると、libheif-js の WASM 初回ロード以外、画像バイトに関連するリクエストは 1 本も出ないことを目視できます。「フォーマットを変えるためにフルサイズの写真を運営者に渡す」というねじれを構造から外せます。