メインコンテンツへ移動

画像をBase64に変換

「画像をBase64に変換」ツールは、画像をコードにそのまま貼り付けられる1ブロックのテキストに変えます。このテキストはdata URIで、CSS、HTML、JSON、Markdownで有効です。画像全体を担っているため、ページに別のファイルは不要で、追加のリクエストも発生しません。テキストはファイルより約33%大きくなります。このページにはそのサイズが表示されます。インライン化の前に立ち止まるべき理由は、まさにこのコストだからです。

端末内で処理

ここに画像をドロップ

ページのどこにでもドロップできます · ファイルを選択 · 100 MB

対応形式: JPG, JPEG, PNG, WebP, AVIF, GIF, SVG, ICO

PNG、JPG、SVG、アイコンをドロップすると、データURIとコード例を生成できます。

画像をBase64に変換はどう動きますか?

data URIとは、参照する場所そのものにファイルをインライン化したものです。src="logo.png"がブラウザに取得させたい別の何かを指す代わりに、画像のバイト列が属性の中に書き込まれます。リクエストなし、2つ目のファイルなし、404になり得るものもありません。

生のバイト列ではなくbase64である理由

こうした文字列の行き先——CSSファイル、HTML属性、JSONの値——はすべてテキストであり、PNGは違うからです。PNGのバイト列には、引用符、改行、ヌルバイトなど、文字列を終端させたりドキュメントを壊したりするものが含まれています。RFC 4648で定義されたBase64は、3バイトごとに4文字へ写像します。使うのはあらゆる場所で安全な64種の記号からなる文字集合で、入力が割り切れないときは=でパディングします。

3バイトにつき4文字——これが33%の正体です。より優れたエンコーダーが取り除けるオーバーヘッドではありません。算術の帰結です。

インライン化が得になるケース

すぐに使う小さなアセットが対象です。CSSルールの中のアイコン、1 × 1のスペーサー、外部画像がデフォルトでブロックされるHTMLメールの中のロゴ、ほかの何よりも先に表示されなければならないプレースホルダー。いずれの場合も、節約できる1リクエストのコストは、支払う33%を上回ります。リクエストにはDNS、接続の確立、往復レイテンシが伴います。モバイル回線では、1パケットで転送できたはずのファイルのために、数十ミリ秒を浪費することになります。

インライン化が間違いになるケース

大きいものや再利用するものには向きません。data URIは独立してキャッシュできません。スタイルシートに200 KBのヒーロー画像をインライン化すると、そのファイルのルールを1つでも変えるたびに、すべての訪問者が画像を再ダウンロードします。並列に取得することもできません。ドキュメントの一部なので、ドキュメントの読み込みが終わる前にダウンロードされ、高速化するはずだった描画を妨げます。さらに、遅延読み込みも、CDNによるリサイズも、対応ブラウザへのWebPでの配信もできません。

おおよその目安は数キロバイトです。それ未満なら、インライン化が通常は勝ちます。10 KB前後を超えると通常は負けます。境界を越えたとき、このページがその旨を表示します。

Content Security Policy

厳格なCSPは、許可しない限りdata URIをブロックします。画像にはimg-src 'self' data:が必要です。同じやり方でインライン化したフォントには、font-srcでもdata:の許可が必要です。インライン化したのに、CSPが強制される本番環境でだけ表示されない、という事態に遭う前に、知っておく価値があります。

Base64は暗号化ではない

はっきり言っておく価値があります。この誤解はよく見かけるからです。base64はエンコードであり、鍵は一切関係せず、誰でも元に戻せます。この方法でインライン化したものは、以前と同じ読みやすさのままです。何も隠しません。

このツールが動く場所

ブラウザ内です。ファイルはFileReaderで読み込まれ、ローカルでエンコードされます。アップロードは一切ありません。自分のソースコードに埋め込もうとしている画像にとって、これ以外の合理的なやり方はありません。

入力

icon.png — 1.2 KB
image/png

出力

data:image/png;base64,iVBORw0KGgo…
1.6 KB (+33%)
no HTTP request

画像をBase64に変換が対応するオプションとエッジケースは?

技術リファレンスとオプション
パラメータ型デフォルト動作とエッジケース
データURIdata:…デフォルトプレーンなURIです。URLが期待される場所にそのまま貼り付けられます。
CSSbackground-image—スタイルシートにそのまま追加できる形式です。
HTML<img>—alt属性は自分で記入するよう空欄にしたimg要素です。
JSON文字列—適切にクォートされており、APIペイロードやフィクスチャファイル用です。
Markdown![]()—自己完結型のREADMEに使える画像構文です。
Base64のみプレフィックスなし—エンコードされたバイト列のみで、MIMEタイプはフィールド側で追加されます。
サイズコスト+33%—入力の3バイトに対して出力が4文字になります。オーバーヘッドではなく計算上の増分です。
CSPimg-src data:—厳格なポリシーは、data URIが許可されるまでブロックします。

よくある質問

base64にすると画像より大きくなるのはなぜですか?

base64は3バイトを4文字で表すためです。仕組み上33%の増加になります。文字集合は64種なので1文字が6ビットを担い、3バイトは24ビット、ちょうど4文字です。テキストとして安全な文字集合に収まる限り、これより優れたエンコーダーは存在しません。サイズが問題なら、エンコードする前に画像を圧縮してください。節約できるのはそこです。

画像をdata URIとしてインライン化すべきですか?

小さな画像なら、はいです。アイコン、スペーサー、HTMLメールの中のロゴ、すぐに必要になる数キロバイト未満のものすべて。節約できるリクエストのコストは、支払う33%を上回るのが普通です。大きな画像なら、いいえです。data URIは個別にキャッシュできず、並列にダウンロードできず、それが入っているドキュメントやスタイルシートをブロックします。インライン化した200 KBのヒーロー画像は、それを含むファイルを変えるたびに再ダウンロードされ、高速化するはずだった描画を遅らせます。

base64の暗号化によって画像は保護されますか?

Base64は暗号化ではありません。鍵を持たない可逆的なテキストエンコードで、テキストしか受け付けない経路でバイナリデータを運ぶために設計されたものです。誰でもブラウザのコンソールで1行でデコードできます。機密性は一切提供しません。提供されているかのように扱うことが、現実のセキュリティ事故が繰り返される原因になっています。

data URIがContent Security Policyにブロックされるのはなぜですか?

厳格なCSPは、data:を明示的に許可すべきソースとして扱うからです。画像ではimg-srcにdata:を含める必要があり、インライン化したフォントではfont-srcにも必要です。CSPは開発環境では強制されていないことが多く、この問題は本番でだけ現れて見逃しやすいものです。インライン化に踏み切る前に、ポリシーを確認してください。

data URIをファイルにデコードし直せますか?

できます。カンマ以降はすべてbase64です。デコードすれば、元のバイト列がバイト単位でそのまま手に入ります。このエンコードは双方向でロスレスです。テキストとしての処理は、このサイトのBase64 Encode / Decodeツールが担っています。また、どのブラウザでも、data URIをアドレスバーに直接貼り付ければ表示されます。

エンコードするために画像はアップロードされますか?

いいえ。ファイルはお使いのブラウザのFileReaderで読み込まれ、このタブの中でエンコードされます。送信されるものは何もありません。見落とされがちですが、ここにはささやかな意味があります。base64でエンコードされる画像は、たいてい手元のプロジェクトのアセットです。それがどこかへ飛んでいく理由はありません。