使い方
- .jpg または .jpeg ファイルをドロップエリアにドロップするか、クリックして選択するか、画像を貼り付けます。
- ファイルをそのまま残すには、変換しない設定(「元の形式のまま」)にします。小さくしたい場合は「変換形式」で JPEG または WebP を選び、「品質」を下げます。
- 写真が実際の表示サイズより大きい場合は、「最大幅」を設定します。
- ページ用の img タグや API 用の Base64 文字列など、必要な出力をコピーするか、ファイルとしてダウンロードします。
JPEG の概要
JPEG は写真の標準的な形式です。目にはほとんどわからない細部を捨てる非可逆圧縮を使い、透過には対応していません。拡張子は .jpg、.jpeg、まれに .jfif ですが、MIME タイプは常に image/jpeg です。image/jpg は登録された MIME タイプではありません(多くのブラウザは受け付けます)。JPEG の data URI は data:image/jpeg;base64,/9j/ で始まります。この部分は、画像の開始を示すマーカー(SOI)をエンコードしたものです。
エンコード前に写真を小さくする
Base64 の影響が最も大きいのは写真です。200 KB の JPEG は約 270 KB のテキストになります。特に効果が大きい設定は次の 2 つです。
- 最大幅。幅を半分にすると、ピクセル数は 4 分の 1 になります。幅 4000 ピクセルのスマートフォンの写真が、そのサイズのまま必要になることはまずありません。
- 品質。70~80% 程度の値なら、画面上では通常オリジナルと見分けがつかず、サイズは大幅に小さくなります。極端に低い値では、ブロック状のノイズが目立ちます。
同程度の品質で WebP に変換すると、さらに小さくなることがよくあります。設定ごとに表示されるエンコード後のサイズを確認し、見た目に問題がない範囲で最も小さい結果を選びましょう。
EXIF メタデータ
カメラやスマートフォンで撮影した写真には、機種、撮影日時、場合によっては GPS 座標などの EXIF メタデータが含まれています。変換しない場合、Base64 の出力にはメタデータを含む元のバイト列がそのまま入り、デコードすれば誰でも読み取れます。API がハッシュを検証したり撮影日を読み取ったりする場合など、ファイルが元のままであることが重要なときは、これが望ましい動作です。
変換するとブラウザ内でピクセルが再エンコードされ、EXIF データは引き継がれません。出力は小さくなり、写真の撮影場所もわからなくなります。
JPEG の data URI が役立つ場面
適しているのは、ぼかした小さなプレースホルダー(幅 20~40 ピクセルの画像をインライン化し、本来の写真は遅延読み込みする)、JSON レスポンス内のサムネイル、1 ファイルで完結する HTML エクスポートなどです。メインビジュアルやギャラリーの画像は、ブラウザがキャッシュできる別ファイルにしましょう。
# Python
import base64
with open('photo.jpg', 'rb') as f:
uri = 'data:image/jpeg;base64,' + base64.b64encode(f.read()).decode('ascii')
よくある質問
JPG と JPEG は同じですか?
はい。短い .jpg という拡張子は、拡張子に 3 文字までしか使えなかったシステムの名残です。どちらも同じ形式で、MIME タイプは image/jpeg です。
Base64 エンコードで JPEG の画質は下がりますか?
いいえ。Base64 はファイルのバイト列を損失なく表現したものです。画質が変わるのは変換を選んだ場合だけで、そのときは設定した「品質」で画像が再エンコードされます。
Base64 文字列に写真の撮影場所が含まれることはありますか?
あります。元の JPEG の EXIF メタデータに GPS データがあり、そのままエンコードした場合、位置情報は文字列に含まれます。画像を変換すると EXIF メタデータは削除されます。