Base64 を JPG に変換する方法
- 入力欄に文字列を貼り付けます。
/9j/で始まる素の Base64 でも、data:image/jpeg;base64,形式の URI 全体でも、それを含む<img>タグや CSS ルールでも構いません。 - ステータス行に 有効な Base64 と表示され、検出 が JPEG になっていることを確認します。プレビューには写真と、そのピクセルサイズ、ファイルサイズが表示されます。
- ファイル名 を設定して ファイルをダウンロード を押します。
大きな写真も問題ありません。数 MB の Base64 文字列も貼り付けるか、.txt ファイルから開けます。4 MB を超えるものは、入力欄に表示せずにデコードします。
戻ってくるもの
デコードすると、エンコードされたバイト列がそのまま戻ります。画質は変わらず、再圧縮も一切しません。つまり、元のファイルに含まれていたものはすべて一緒に戻ってきます。
- EXIF メタデータ:カメラの機種、撮影日時、向き、位置情報がオンだった場合は GPS 座標も含まれます。誰かから受け取った Base64 なら、写真は送り主が意図した以上のことを教えてくれるかもしれません。これから誰かに渡すなら、先にメタデータを削除してください。たとえば JPG を Base64 に変換 の メタデータ(EXIF)を削除 を使います。
- 埋め込みのサムネイルやカラープロファイル。
- 画像の終端の後に続くデータ:一部の Android スマートフォンのモーションフォトは、JPEG の後に短い動画を追加しています。そうした「写真」が想定の何倍も大きくなるのはこのためです。
プレビューの下の SHA-256 を使えば、保存したファイルが渡されたハッシュと一致することを証明できます。
本物の JPEG と、JPEG を名乗るだけのものを見分ける
デコーダーはラベルを無視し、バイト列で判断します。PNG のデータが入った data:image/jpeg 形式の URI や、photo_jpg という名前なのに WebP が入った API フィールドは、その正体どおりに報告されます。「これは JPEG ではなく WebP のようです。」と表示され、.webp としてダウンロード ボタンが付きます。
画像 CDN はブラウザの Accept ヘッダーから出力形式を選ぶので、photo.jpg として取得してブラウザで Base64 にエンコードした画像が、WebP や AVIF になっていることがあります。ブラウザの「画像をコピー」で取った画像は、ページに表示されていたのが JPEG でも、たいてい PNG としてクリップボードに入ります。そのため、クリップボードからエンコードしたものは PNG の Base64 になります。
どうしても JPEG が必要なら、名前を変えても意味はありません。本来の形式でファイルを保存し、画像を Base64 に変換 の 変換先 で JPEG に変換してから、その結果をここでデコードしてください。
途中で切れた JPEG を見つける
JPEG ファイルはマーカー FF D9 で終わります。ファイルの長さを 3 で割った余りによって、Base64 の末尾は次の 3 通りのどれかになります。
| ファイル長を 3 で割った余り | 最後のバイト | Base64 の末尾 |
|---|---|---|
| 2 | FF D9 | /9k= |
| 1 | .. FF D9 | /2Q== |
| 0 | .. FF D9 | /Z(たいていは //Z) |
途中で切れた JPEG もデコードはできます。ブラウザは受け取った部分を描画するので、写真の下の部分が灰色になるか欠け、プログレッシブ JPEG ならぼやけて見えます。よくある原因は、短すぎるデータベースのカラム、行の長さを制限するロガー、長いテキストを分割するメッセージアプリです。元の場所から値をコピーし直してください。
同じチェックを Python で行う例です。
import base64
def check_jpeg(b64: str) -> str:
data = base64.b64decode(b64.split(",", 1)[-1])
if not data.startswith(b"\xff\xd8\xff"):
return "not a JPEG"
end = data.rfind(b"\xff\xd9")
if end < 0:
return "truncated: no end-of-image marker"
extra = len(data) - end - 2
return f"complete, {extra} bytes after the end marker" if extra else "complete"
簡易テストとして使ってください。カメラで撮った JPEG には独自の FF D9 を持つ EXIF サムネイルが入っているので、大きく欠けた写真でもこのチェックを通ることがあります。ファイルのデコードについては Python での Base64 で詳しく解説しています。
よくある問題
- 「長さが不正です」エラー。 1 文字が失われたか余分に入っています。たいていはコピー時の改行の位置で起きます。値全体をコピーし直してください。
- 無効な文字
\。 スラッシュがエスケープされた JSON(\/9j\/4AAQ...)から取った文字列です。Base64 を修復 に通すか、先に JSON のエスケープを解除してください。 - 写真が巨大。 Base64 では画像の本当の大きさが分かりにくくなります。4 MB の文字列は 3 MB の写真です。サイズ の行にデコード後のサイズが、プレビューの上にピクセル寸法が表示されます。
よくある質問
デコードしたファイルは .jpg と .jpeg のどちらにすべきですか?
どちらでも構いません。2 つの拡張子は同じ形式を表し、どのプログラムも両方を受け付けます。このツールは .jpg を使います。長いほうの表記を必須とするシステムなら、拡張子 に jpeg と入力してください。
JPEG の Base64 文字列が完全かどうかを確かめるには?
完全な JPEG はバイト FF D9 で終わるので、その Base64 はたいてい /9k=、/2Q==、/Z のいずれかで終わります。文字列の末尾がこれと違う場合や、画像の下の部分が欠けている場合は、どちらも途中で切れていることを示しています。
デコードした写真の EXIF データを見られますか?
このツールは EXIF の項目を一覧表示しませんが、16進ダンプを表示 で Exif ブロックが見え、テキスト列にカメラのメーカー名が出ていることもよくあります。すべての項目を見るには、ファイルをダウンロードして EXIF ビューアで開いてください。
デコードした写真が一部のアプリで回転して表示されるのはなぜですか?
スマートフォンはピクセルを横向きのまま保存し、回転を EXIF タグに記録することがよくあります。ブラウザはそれを適用するのでプレビューは正しく見えますが、タグを無視するソフトでは元の向きのまま表示されます。どちらの場合もバイト列は変わっていません。