iPhoneで撮った写真をPCへ移したら、
IMG_1234.HEIC
になっていて、
「ブラウザで開けない」
「Webフォームにアップロードできない」
「JPGに変換したい」
ということがあります。
HEICは容量効率のよい画像形式ですが、JPGほど広く扱えるわけではありません。
そのため、Webサービスや既存システムとの互換性を考えて、
HEIC → JPG
へ変換する場面があります。
ただし、拡張子を変えるだけでは変換できません。
また、変換によって、
- 画質
- ファイルサイズ
- Exif
- 色
- メタデータ
- 透過情報
などが変わる可能性があります。
この記事では、HEICをJPGへ変換するときに何が起きているのかを整理します。
HEICとは?
HEICは、HEIF系の画像を保存するときによく使われる拡張子です。
iPhoneで撮影した写真を扱っていると、特によく見かけます。
JPGと同じように写真を保存できますが、圧縮効率が高く、
比較的小さいファイルサイズで
高い画質を保ちやすい
という特徴があります。
その一方で、Webや古いアプリケーションでは対応していないことがあります。
JPGは互換性が高い
JPGは非常に広く使われています。
たとえば、
- Webブラウザ
- CMS
- ECサイト
- SNS
- メール
- 画像編集ソフト
- 業務システム
など、多くの環境で扱えます。
そのため、
HEICでは受け付けてもらえない
という場合にJPGへ変換するのは現実的な方法です。
拡張子を書き換えるだけではダメ
たとえば、
photo.heic
を、
photo.jpg
へ名前変更しても、JPGにはなりません。
ファイル内部のデータはHEICのままです。
画像形式を変えるには、
HEICをデコード
↓
画像データを取得
↓
JPEG形式で再エンコード
という処理が必要です。
つまり、
ファイル名の変更ではなく、画像の再エンコード
が必要です。
変換すると画質は変わる?
HEICからJPGへ変換すると、通常はJPEGとして再圧縮されます。
JPEGは非可逆圧縮です。
そのため、変換時の品質設定によっては、
細部が少し失われる
ノイズが増える
文字の輪郭がにじむ
といった変化が起こる場合があります。
特に、
HEIC → JPG → JPG → JPG
のように何度も再保存すると、圧縮劣化が積み重なりやすくなります。
変換後のファイルサイズは必ず小さくなる?
これは必ずしもそうではありません。
HEICは圧縮効率が高いため、
元のHEIC
↓
JPGへ変換
すると、JPGの方が大きくなることもあります。
たとえば、
HEIC 2MB
JPG 4MB
のようになるケースもあり得ます。
もちろんJPEG品質を下げれば容量は小さくできますが、その分画質も変わります。
同じ見た目でも容量は違う
画像形式によって、
どのように圧縮するか
が違います。
そのため、
同じ解像度
同じ写真
見た目もほぼ同じ
でも、ファイルサイズが同じになるとは限りません。
「JPGの方が一般的だから軽い」
とは限らない点に注意が必要です。
解像度はそのままにできる
変換処理でリサイズを行わなければ、
たとえば、
4032 × 3024 px
のHEICを、
4032 × 3024 px
のJPGとして出力できます。
つまり、
画像形式の変換
と、
画像サイズの変更
は別の処理です。
HEICをJPGへ変換したからといって、自動的に画像の縦横サイズが小さくなるわけではありません。
Exif情報はどうなる?
写真ファイルには、画像そのもの以外にメタデータが含まれていることがあります。
代表的なのがExifです。
たとえば、
撮影日時
カメラ情報
向き
露出
焦点距離
GPS情報
などです。
HEICからJPGへ変換するとき、
Exifがそのまま引き継がれるかどうかは変換方法によります。
変換ツールによっては、
画像だけ変換
メタデータは削除
ということもあります。
GPS情報は特に確認したい
スマートフォンで撮影した写真には、位置情報が保存されていることがあります。
そのため、
Webへアップロードする写真を変換する場合、
GPS情報を残すのか
削除するのか
も確認しておくと安心です。
変換後のJPGにどのメタデータが残るかは、利用する処理やライブラリによって異なります。
写真の向きが変わることがある理由
画像を変換すると、
横向きになった
上下逆になった
という問題が起こることがあります。
原因の一つがExif Orientationです。
画像データそのものを回転せず、
表示するときは90度回転する
という情報だけを持っているファイルがあります。
変換処理がこの情報を正しく処理しないと、見た目の向きが変わる場合があります。
変換時はOrientationを適用する
一般的には、
元画像を読み込む
↓
Orientationを確認
↓
必要なら画像本体を回転
↓
JPGへ保存
という処理を行うと扱いやすくなります。
画像変換ライブラリを使う場合も、
自動回転
orientation
autorotate
などの機能があるか確認するとよいでしょう。
HEICにはJPGより多くの情報を持てる場合がある
HEIC系の形式では、単純な1枚の画像だけでなく、より複雑な情報を扱える場合があります。
一方、一般的なJPGは、
1枚の静止画
として扱うのが基本です。
そのため、
HEICに含まれている情報をすべてJPGへ完全に移せる
とは限りません。
変換は、
互換性を上げる代わりに
一部の機能や情報を単純化する
処理とも言えます。
透過が必要ならJPGは向かない
JPEGには通常、
透明
半透明
を表すアルファチャンネルがありません。
そのため、透明情報を持つ画像をJPEGへ変換すると、
背景が白や黒などに置き換わる可能性があります。
透明背景を維持したい場合は、
PNG
WebP
など、別形式を検討した方がよい場合があります。
HEICからJPGにする理由は「画質」より「互換性」
HEICからJPGへ変換する主な理由は、
JPGの方が高画質だから
ではありません。
むしろ、
対応している環境が多い
という互換性のメリットが大きいです。
たとえば、
古いWebシステムへアップロードしたい
CMSがHEICを受け付けない
Windows環境で簡単に扱いたい
メール添付先で確実に開いてほしい
といったケースです。
WebアップロードではHEICが問題になることがある
画像アップロード機能を作る場合、
<input type="file">
でファイルを受け付けても、その後の処理側でHEICに対応していないことがあります。
たとえば、
サムネイル生成
画像圧縮
OCR
画像編集
外部API
などです。
アップロード自体は成功しても、後段の画像処理でエラーになるケースがあります。
MIMEタイプだけで判断しすぎない
ファイルアップロードでは、
拡張子
MIMEタイプ
実際のファイル内容
を分けて考える必要があります。
ユーザーがファイル名だけ変更することもできるため、
.jpgだからJPEG
と決めつけるのは危険です。
サーバー側でファイル形式を確認する場合は、実際のバイナリ内容も含めて判定する方が安全です。
HEICを受け付けるなら変換処理を考える
Webサービス側でHEICを許可するなら、
アップロード
↓
HEICをデコード
↓
必要ならOrientationを補正
↓
リサイズ
↓
JPG / WebPへ変換
↓
保存
といった処理フローが考えられます。
こうしておけば、ユーザーはiPhoneの写真をそのままアップロードできます。
クライアント側変換とサーバー側変換
HEIC変換を実装するときは、大きく分けて、
ブラウザ側
サーバー側
の2つがあります。
ブラウザ側で変換すれば、変換後のファイルだけをアップロードできます。
メリットは、
サーバーへの転送量を減らせる可能性がある
元画像を送らずに済む構成にできる
ことです。
一方で、端末性能やブラウザ対応の影響を受けます。
サーバー側変換のメリット
サーバー側なら、
変換環境を統一しやすい
品質設定を管理しやすい
大量処理を制御しやすい
というメリットがあります。
ただし、HEICをデコードできるライブラリや環境が必要です。
また、高解像度画像を大量に変換する場合はCPUやメモリも使います。
画像変換は意外とメモリを使う
たとえば、
4032 × 3024
の画像は、圧縮ファイルとしては数MBでも、デコード後はそれより大きなメモリを使います。
RGBAとして単純計算すると、
4032 × 3024 × 4byte
なので、約49MBです。
画像処理では、
ファイルサイズが3MBだから
メモリも3MB程度
とは限りません。
大量変換を行うバックエンドでは注意が必要です。
変換後にリサイズするなら順番も考える
Web用に最終的に、
1200px幅
程度しか必要ないなら、高解像度のままJPEG保存してから再度縮小するより、
HEICをデコード
↓
必要サイズへリサイズ
↓
JPEGとしてエンコード
とした方が効率的です。
不要な大きさのJPGを一度生成する必要がありません。
JPEG品質は高ければいいわけではない
JPEGでは、
quality 100
に近づけるほど高画質になりますが、容量も増えます。
Web画像なら、
見た目の差
ファイルサイズ
用途
のバランスを見て決める必要があります。
写真によっても圧縮結果は違うため、
常に品質90が正解
のような決まりはありません。
WebPへ変換する選択肢もある
目的が、
Webサイトで表示したい
だけなら、HEICからJPGではなくWebPへ変換する方法もあります。
WebPはWeb用途で広く使われています。
ただし、
ダウンロードして他のソフトでも使いたい
メールで送りたい
業務システムへ登録したい
という用途では、JPGの互換性が便利な場合があります。
形式は用途で選ぶのがよいでしょう。
HEICからJPGへ変換したいだけなら
開発用途ではなく、iPhoneなどから取り込んだHEIC画像をJPGとして使いたいだけなら、HEIC画像をJPGに変換すると、形式を変換して確認できます。
HEICに対応していないサービスへ画像を送る前など、互換性を確保したい場面で使えます。
実装するときに確認したい項目
HEIC変換機能を作るなら、単に、
変換できた
だけではなく、次の点も確認しておくとよいです。
画像の向きは正しいか
解像度は維持されているか
JPEG品質はいくつか
Exifを残すか
GPS情報を残すか
色が大きく変わっていないか
大容量画像でメモリエラーにならないか
複数ファイルを同時処理できるか
特にスマートフォン写真は解像度が高いため、実際の端末から取得した画像でテストすることが重要です。
「変換」と「最適化」は分けて考える
HEICからJPGへ変えることと、
画像をWeb向けに最適化すること
は別です。
変換は、
画像形式を変える
ことです。
最適化では、
リサイズ
品質調整
Exif削除
容量削減
なども行います。
Webサービスでは、この2つを一連の処理として実行することもあります。
まとめ
HEICからJPGへの変換は、
.heic
↓
.jpg
と拡張子を変更するだけではありません。
実際には、
HEICをデコード
↓
画像データを取得
↓
JPEGとして再エンコード
しています。
その際には、
- JPEGの再圧縮による画質変化
- ファイルサイズ
- Exif
- GPS情報
- Orientation
- 透過
- 色情報
なども考慮する必要があります。
単純に写真を共有するだけなら、
JPGは互換性が高く扱いやすい形式
です。
一方、WebサービスとしてHEIC対応を実装するなら、
「JPGに変換できるか」だけでなく、変換時にどの情報を残し、どの情報を捨てるか
まで仕様として決めておくと、後からトラブルになりにくくなります。