使い方
- .bmp ファイルをドロップエリアにドロップするか、クリックして選択するか、画像を貼り付けます。
- ロスレスのまま大幅に小さくするには、「変換形式」で PNG を選びます。受け取る側のシステムが BMP を必要とする場合は BMP のままにします。
- 元のサイズとエンコード後のサイズを比べて、削減量を確認します。
- 結果を data URI、Base64 文字列のみ、img タグ、CSS ルール、Markdown の画像としてコピーまたはダウンロードします。
BMP ファイルとは
BMP は、Windows のデバイス非依存ビットマップ形式です。ピクセルを 1 行ずつ格納し、ほとんどの場合は圧縮しません(4 ビットと 8 ビットの画像には簡単なランレングス圧縮モードがあります)。MIME タイプは image/bmp ですが、image/x-ms-bmp と報告するシステムもあります。Base64 の出力は、文字 BM をエンコードした Qk で始まります。
圧縮しないため、サイズは画像の寸法から直接決まります。800×600 ピクセルの 24 ビット画像は約 1.4 MB になり、その Base64 は 1.9 MB 近いテキストになります。
エンコード前に PNG に変換する
PNG もロスレスなので、一般的な 24 ビットのビットマップを PNG に変換すると、ピクセルはまったく同じままファイルが小さくなります。数分の 1 になることも多く、スクリーンショットや平坦なグラフィックではさらに大きく縮みます。BMP で保存された写真なら、十分な品質の JPEG や WebP にすると、文字列はさらに短くなります。画像ごとに元のサイズとエンコード後のサイズが表示されるので、違いがひと目でわかります。
元の BMP のままにすべき場合
受け取る側が本物のビットマップを必要とする場合があります。古い Windows ソフトウェア、ラベルプリンターやレシートプリンター、マイコンで制御する小型ディスプレイ、バイト単位で一致する必要があるテスト用ファイルなどです。こうした場合は変換しないでください。Base64 の出力はファイルの正確なコピーになります。主要なブラウザはすべて data:image/bmp の画像を表示できますが、Web ページやメールには PNG のほうが適しています。
同じ変換を、Python と Pillow を使ってスクリプトで行う例です。
from PIL import Image
import base64, io
buf = io.BytesIO()
Image.open('scan.bmp').save(buf, 'PNG')
uri = 'data:image/png;base64,' + base64.b64encode(buf.getvalue()).decode()
よくある質問
BMP の Base64 文字列がこれほど長いのはなぜですか?
BMP はすべてのピクセルを圧縮せずに格納しており、Base64 がさらに 3 分の 1 を上乗せするためです。先に PNG に変換すれば、細部を一切失わずに文字列を劇的に短くできるのが普通です。
BMP を PNG に変換すると画質は落ちますか?
いいえ。PNG はロスレス形式なので、ピクセルは変わりません。変わるのは格納方法だけです。
ブラウザは data:image/bmp の URI を表示できますか?
はい。Chrome、Edge、Firefox、Safari はいずれも BMP を表示できます。メールクライアントや多くのオンラインプラットフォームでは扱いが不安定なため、そうした場面では PNG のほうが安全です。
BMP は透過に対応していますか?
32 ビットの BMP はアルファチャンネルを格納できますが、プログラムやブラウザによって扱いがまちまちです。透過が必要な場合は PNG または WebP に変換してください。