画像を Base64 に変換する方法
- 画像を枠にドロップするか、Ctrl+V(Mac では Cmd+V)でクリップボードから貼り付けるか、ファイル選択を使います。スクリーンショットはクリップボードから直接貼れますし、複数のファイルを同時に扱うこともできます。
- 必要なら、先に縮小や変換をします。最大幅 にピクセル数を入力する、変換先 で PNG、JPEG、WebP を選ぶ、品質 を設定する、メタデータ(EXIF)を削除 にチェックを入れる、といった操作ができます。
- 出力形式 で形式を選びます。このページは Data URI から始まります。
- 出力をコピー を押すか、長い結果なら .txt で保存 を使います。
プレビューには、ファイル名、サイズ、MIME タイプ、ピクセル寸法が表示されます。ボタンの下には入力サイズ、出力サイズ、増加率が表示されるので、これから貼り付けるものの大きさがわかります。
出力形式と使い道
Base64 のデータはどの形式でも同じで、変わるのはそれを包む部分だけです。以下の例は logo.png という 32×32 の PNG を使い、省略して示しています。
| 出力形式 | 得られるもの | 主な用途 |
|---|---|---|
| プレーン Base64 | iVBORw0KGgoAAAANSUhEUg... | JSON のフィールド、API、データベース |
| Data URI | data:image/png;base64,iVBORw0K... | URL を受け付ける任意の src や url() |
| CSS background-image | background-image: url("data:image/png;base64,..."); | スタイルシート、style 属性 |
HTML <img> | <img src="data:image/png;base64,..." alt="logo" width="32" height="32"> | HTML ページ、単一ファイルのレポート |
| Markdown |  | Data URL を許可する Markdown レンダラー |
HTML <a download> | <a href="data:..." download="logo.png">logo.png</a> | ファイルをダウンロードとして提供する |
| JSON | {"name": "logo.png", "type": "image/png", "size": 105, "data": "iVBOR..."} | テスト用フィクスチャ、自前のアップロード API |
<img> の出力には width と height が含まれるので、ブラウザは画像のデコード前に表示領域を確保できます。Markdown レンダラーの中には、画像の data: URL を取り除くものがあります(特にホスティング型のプラットフォーム)。Markdown 出力を使う前に、お使いの環境で確認してください。
エンコードする前にリサイズ・変換する
Base64 は何を入れてもサイズを 3 分の 1 増やすので、短い文字列を得るいちばんの方法は画像を小さくすることです。300 ピクセルのサムネイルとして表示するスマートフォンの写真に、元の 4000 ピクセルは要りません。最大幅 を、高 DPI の画面でもくっきり見える表示サイズの 2 倍の 600 にすれば、どんなエンコードの工夫よりも大きく削れます。
各オプションの働き:
- 最大幅 は縮小だけを行います。それより狭い画像は寸法が変わらず、縦横比は常に保たれます。
- 変換先 で JPEG を選ぶと、JPEG にはアルファチャンネルがないため、透明な部分は白で塗りつぶされます。透過と小さなサイズを両立したいなら WebP を使ってください。
- 品質 は、ほかのオプションによって再エンコードが行われるときの JPEG と WebP の出力に適用されます。PNG は可逆なので無視されます。
- メタデータ(EXIF)を削除 は、GPS 座標、端末の機種、撮影日時などのカメラのデータを取り除きます。画像を描き直すことで実現しているので、JPEG は選んだ品質で再圧縮されます。
- GIF、BMP、AVIF は、形式を維持 で再エンコードすると PNG として書き出されます。ブラウザは canvas からこれらの形式を作れないからです。アニメーション GIF は最初のフレームだけが残ります。
- Safari は WebP にエンコードできません。Safari で WebP を選ぶと、ツールは代わりに PNG を出力し、その旨を表示します。
- SVG ファイルはそのままエンコードされます。もともとテキストであり、ベクター画像をラスター化してはその利点が失われるからです。
最適化ツールですでに圧縮した PNG は、再エンコードすると大きくなることがあります。プレビューには元のサイズの横に新しいサイズが表示されるので、コピーする前に比べてください。
画像を埋め込むべきとき、そうでないとき
Data URI を使えば HTTP リクエストが 1 つ減り、すべてを 1 つのファイルに収められます。これが効果を発揮するのは次のような場合です。
- 数 KB のアイコン、ロゴ、小さな UI 画像
- レポート、オフラインのドキュメント、書き出したダッシュボードなど、単一ファイルの HTML 文書
- 本物の画像を読み込む間に表示する、小さなぼかしのプレースホルダー
- 別ファイルが扱いにくいテスト用フィクスチャや JSON のペイロード
写真や大きなものには逆効果です。エンコードしたコピーは約 33% 大きく、それを含む HTML や CSS と切り離してキャッシュできず、埋め込んだページごとに毎回ダウンロードされます。スタイルシート内の画像はスタイルシートの読み込みを遅らせ、それが描画を遅らせます。loading="lazy" も役に立ちません。バイト列はすでに文書の中にあるからです。詳しくは Data URI のパフォーマンス をご覧ください。サイズ計算ツール を使えば、決める前にエンコード後のサイズがわかります。
メールは特殊なケースです。Gmail などいくつかの Web メールは Data URI の画像をまったく表示しないので、ニュースレターでは通常、サーバーに置いた画像か CID 添付を使います。メールの Base64 をご覧ください。
API や AI の画像認識モデルに渡す画像
JSON にはバイナリの型がないので、リクエスト本文で画像を受け取る API は Base64 を想定しています。画像を説明したり分類したり、画像内の文字を読み取ったりできる多くのマルチモーダル AI モデルもそうです。渡し方は 2 通りあります。
- 1 つの文字列に完全な Data URI を入れる:
data:image/jpeg;base64,/9j/4AAQ... - 1 つのフィールドに Base64 だけを入れ、別のフィールドにメディアタイプ(
image/jpeg)を入れる
前者には Data URI を、後者には プレーン Base64 を使ってください。Base64 だけを想定する API に data: の接頭辞を付けて送ったり、その逆をしたりするのは、こうしたリクエストが拒否されるよくある原因です。こうしたサービスはたいていリクエストサイズに上限があり、大きな画像はどのみちサービス側で縮小されることが多いので、エンコード前にリサイズしておけば、ほとんど損をせずにリクエストを小さくできます。
埋め込める画像形式
| 形式 | MIME タイプ | Base64 の先頭 | 表示できるブラウザ |
|---|---|---|---|
| PNG | image/png | iVBORw0KGgo | すべてのブラウザ |
| JPEG | image/jpeg | /9j/ | すべてのブラウザ |
| GIF | image/gif | R0lGODlh(GIF89a)、R0lGODdh(GIF87a) | すべてのブラウザ |
| WebP | image/webp | UklGR | 現在のすべてのブラウザ |
| AVIF | image/avif | AAAA、9 文字目から eXBhdmlm | Chrome 85+、Firefox 93+、Safari 16.4+ |
| SVG | image/svg+xml | PHN2Zy(<svg)または PD94bWwg(<?xml ) | すべてのブラウザ |
| BMP | image/bmp | Qk | すべてのブラウザ |
| ICO | image/x-icon | AAABAA | すべてのブラウザ |
| HEIC | image/heic | AAAA、9 文字目から eXBoZWlj | Safari 17+ のみ |
| TIFF | image/tiff | SUkqAA または TU0AKg | Safari のみ |
HEIC と TIFF も問題なくエンコードできますが、どちらの Data URI も Chrome と Firefox では壊れた画像になります。代わりにどうすればよいかは HEIC と TIFF のページで説明しています。ほかのシグネチャは よくある Base64 の接頭辞 をご覧ください。
コードで同じことをする
ブラウザでは、FileReader が Data URI を直接返します。
function imageToDataUri(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
Python では、バイト列を読み込んで接頭辞を自分で付けます。
import base64, mimetypes
def to_data_uri(path):
mime = mimetypes.guess_type(path)[0] or "application/octet-stream"
with open(path, "rb") as f:
return f"data:{mime};base64,{base64.b64encode(f.read()).decode()}"
大きなファイルのストリーミングを含むほかのやり方は、JavaScript の Base64 と Python の Base64 にあります。
画像が表示されないとき
- HTML で画像が壊れて表示される。 Data URI では URLセーフ(- _) のチェックを外してください。ブラウザは
data:URL を標準のアルファベットでしかデコードしないので、+や/の代わりに-や_があると画像が壊れます。 - HTML では表示されるのに CSS では表示されない。 76 文字で折り返し は文字列に改行を入れます。HTML の属性は改行を許容しますが、CSS の
url("...")の文字列内に改行があるとルールが無効になります。メール本文以外では折り返しをオフにしてください。 - 接頭辞が二重になっている。
data:image/png;base64,data:image/png;base64,で始まる文字列は、自前で接頭辞を付けるテンプレートに Data URI を貼り付けた結果です。そこでは プレーン Base64 を使ってください。 - デコード後に違う画像になる、または何も表示されない。 先頭の文字を上の表と照らし合わせてください。先頭が形式と合わないなら、文字列が途中で切れているか、取り違えています。Base64 を画像に変換 で、バイト列の本当の中身がわかります。
よくある質問
Base64 の画像を HTML に入れるには?
出力形式 を HTML <img> にして、結果をページに貼り付けます。タグにはすでに data:image/...;base64, の接頭辞と画像の幅・高さが入っています。生成された alt テキストは、実際の説明に書き換えてください。
画像を Base64 に変換すると画質は落ちますか?
落ちません。Base64 は可逆なテキストエンコードなので、デコードすれば元のバイト列がそのまま戻ります。画質が変わるのは、エンコード前に画像を描き直すリサイズ、変換、メタデータ削除のオプションを使ったときだけです。
Base64 の文字列が画像ファイルより大きいのはなぜですか?
Base64 は 3 バイトごとに 4 文字で書くので、出力はファイルより約 33% 大きくなります。出力の下の増加率で、その画像での正確な数値がわかります。計算式は Base64 のサイズ増加 にあります。
複数の画像をまとめて変換できますか?
できます。複数のファイルを選ぶかドロップすると、サイズ付きで一覧表示されます。表示 で 1 つの結果を見るか、すべて JSON でコピー で各画像の名前、タイプ、サイズ、Base64 データを含む配列を取得できます。
Base64 を画像ファイルに戻せますか?
Base64 を画像に変換 で戻せます。プレーンな Base64 と完全な Data URI のどちらも受け付け、デコードしたファイルをダウンロードできます。