JPG を Base64 に変換する方法
.jpgか.jpegファイルをドロップするか、ファイル選択で選ぶか、コピーした画像を Ctrl+V で貼り付けます。- カメラやスマートフォンから取り込んだままの写真なら、最大幅(たとえば 1200)を設定し、品質 を調整します。デフォルトは 85% です。
- 写真を共有や公開するなら、メタデータ(EXIF)を削除 にチェックを入れます。
- 出力形式 を選びます。デフォルトは Data URI で、たいていの API が求めるのはプレーン Base64 です。それから 出力をコピー します。
プレビューにはピクセル寸法と、再エンコード後の新しいファイルサイズが表示されます。いくつか設定を試しながら数値が下がるのを確認できます。
JPG の Base64 の中身
JPEG ファイルはすべて SOI マーカー FF D8 FF で始まるので、Base64 ではすべて /9j/ で始まります。続く文字で、どのヘッダーが来るかがわかります。
| ファイルの先頭 | Base64 の先頭 | よくある出どころ |
|---|---|---|
FF D8 FF E0 + JFIF | /9j/4AAQSkZJRg | 画像エディター、Web 用の書き出し、ほとんどの変換ツール |
FF D8 FF E1 + Exif | /9j/4 と、その後に変化する文字 | カメラやスマートフォン(EXIF ブロックが先頭) |
FF D8 FF DB | /9j/2w | メタデータを削除したものや最小構成のエンコーダー |
カメラの JPEG には EXIF ブロックがあり、端末の機種、撮影日時、向き、位置情報がオンなら GPS 座標が入っています。Base64 はそのどれも隠しません。Base64 を JPG に変換 で文字列をデコードすれば、誰でもメタデータがそのまま残った元のファイルを得られます。
エンコード前に写真を小さくする
最近のスマートフォンの写真は数 MB あります。Base64 にするとさらに 3 分の 1 増え、JSON のリクエスト、CSS ファイル、HTML メールには大きすぎ、ほかの場所でも遅くなります。
ほとんどの効果は 2 つの設定で得られます。
- 最大幅 は、幅の上限をピクセル数で設定します。幅を半分にすると、ピクセル数は 4 分の 1 になります。
- 品質 は JPEG の圧縮を制御します。写真が再エンコードされるとき、つまり 最大幅、変換先、メタデータ(EXIF)を削除 のいずれかを設定したときに効きます。写真なら 75% と 85% の違いはほとんど見分けられず、ファイルは 95–100% のときよりずっと小さくなります。
JPEG を再エンコードすると、デコードしてもう一度圧縮するため、必ず細部が少し失われます。元のファイルから一度だけ行い、結果をもう一度変換ツールにかけるのは避けてください。
JPEG には透過がありません。背景が透明な PNG や WebP を JPEG に変換すると、透明な部分は白になります。アルファチャンネルが必要なら PNG か WebP のままにしてください。
JPG の Base64 が使われる場面
- JSON API による写真のアップロード:画像を説明・分析する AI の画像認識モデルも含みます。多くは大きな画像をサービス側で縮小するので、小さめの JPEG を送れば、見た目の劣化なしにリクエストが速くなります。
- HTML に埋め込むサムネイルやプレースホルダー:フルサイズの画像を読み込む間に表示する、幅 20 ピクセルのぼかしたプレビューなど。
- 単一ファイルの文書:写真を何枚か埋め込んだ HTML のレポートなど。
Web サイトの大きな写真には、やはり通常の画像ファイルのほうが適しています。キャッシュ、遅延読み込み、srcset による複数サイズの配信ができるからです。
Python でリサイズしてエンコードする
Pillow なら写真のリサイズと再エンコードが数行ででき、Base64 化は標準ライブラリが行います。Pillow は明示的に渡さない限り EXIF を新しいファイルにコピーしないので、これでメタデータも削除されます。
import base64, io
from PIL import Image
with Image.open("photo.jpg") as im:
im.thumbnail((1024, 1024))
buf = io.BytesIO()
im.save(buf, "JPEG", quality=80)
b64 = base64.b64encode(buf.getvalue()).decode("ascii")
ファイルの読み込みやストリーミングについては Python の Base64 をご覧ください。
よくある問題
- 写真が回転して表示される。 多くのスマートフォンは、ピクセルをセンサーの向きのまま保存し、回転を EXIF タグに記録します。現在のブラウザはそのタグを適用し、このツールも写真を描き直すときは見た目の向きを保ちます。EXIF を無視するソフトウェアでは、元の向きのまま表示されることがあります。
- Base64 が思ったより長い。 メーターで入力サイズを確認してください。メッセンジャーで受け取った「小さな」写真でも、幅が 3000 ピクセルあることがあります。
- API に画像を拒否される。
data:image/jpeg;base64,の接頭辞付きか Base64 だけかを確認し、タイプはimage/jpgではなくimage/jpegを送ってください。
よくある質問
Data URI では image/jpg と image/jpeg のどちらですか?
image/jpeg です。image/jpg は登録されたタイプではありません。ブラウザは画像のバイト列から判別するので表示はされますが、メディアタイプを検証する API では拒否されることがあります。
Base64 にした JPG にも GPS の位置情報は残っていますか?
元のファイルに含まれていれば残っています。Base64 は EXIF も含めてすべてのバイトを写すからです。取り除くには メタデータ(EXIF)を削除 にチェックを入れてください。エンコード前に、写真がメタデータなしで描き直されます。
JPG の Base64 が /9j/ で始まるのはなぜですか?
JPEG はすべてバイト FF D8 FF で始まり、この 3 バイトをエンコードするとちょうど /9j/ になります。違う文字で始まる文字列は、ファイル名が何であれ JPEG ではありません。
写真の Base64 を短くするには?
エンコード前にピクセル数と品質を下げてください。表示サイズに合わせた 最大幅 と 75–85% 程度の 品質 にすれば、Base64 そのものに何をするよりもずっと、スマートフォンの写真を小さくできます。