ตัวแปลง BMP เป็น Base64

เข้ารหัสไฟล์บิตแมปของ Windows (.bmp) เป็น Base64 เนื่องจาก BMP มักไม่มีการบีบอัด คุณจึงแปลงเป็น PNG, JPEG หรือ WebP ก่อนเพื่อให้ได้ผลลัพธ์ที่สั้นลงมากได้

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. ลากไฟล์ .bmp มาวางในพื้นที่วางไฟล์ คลิกเพื่อเลือกไฟล์ หรือวางรูปภาพ
  2. เลือก PNG ในตัวเลือก “แปลงเป็น” เพื่อให้ได้ผลลัพธ์แบบไม่สูญเสียข้อมูลที่เล็กลงมาก หรือเลือก “คงรูปแบบเดิม” หากระบบปลายทางต้องการไฟล์ BMP
  3. เปรียบเทียบขนาดต้นฉบับกับขนาดหลังเข้ารหัสเพื่อดูว่าประหยัดได้เท่าใด
  4. คัดลอกหรือดาวน์โหลดผลลัพธ์เป็น data URI, Base64 ล้วน, แท็ก img, กฎ CSS หรือรูปภาพ Markdown

ไฟล์ BMP คืออะไร

BMP คือรูปแบบบิตแมปที่ไม่ขึ้นกับอุปกรณ์ (device-independent bitmap) ของ Windows จัดเก็บพิกเซลทีละแถว และแทบทุกครั้งไม่มีการบีบอัด (มีโหมด run-length แบบง่ายสำหรับภาพ 4 บิตและ 8 บิต) ชนิด MIME คือ image/bmp แม้บางระบบจะรายงานเป็น image/x-ms-bmp และเอาต์พุต Base64 จะขึ้นต้นด้วย Qk ซึ่งคือตัวอักษร BM ที่เข้ารหัสแล้ว

เมื่อไม่มีการบีบอัด ขนาดไฟล์จะขึ้นอยู่กับขนาดภาพโดยตรง ภาพ 24 บิตขนาด 800 x 600 พิกเซลต้องใช้พื้นที่ประมาณ 1.4 MB และ Base64 ของภาพนี้จะเป็นข้อความเกือบ 1.9 MB

แปลงเป็น PNG ก่อนเข้ารหัส

PNG เป็นรูปแบบไม่สูญเสียข้อมูลเช่นกัน บิตแมป 24 บิตทั่วไปที่แปลงเป็น PNG จึงคงพิกเซลไว้ทุกประการในขณะที่ไฟล์เล็กลง ซึ่งมักเล็กลงหลายเท่า และเล็กลงได้มากกว่านั้นอีกสำหรับภาพหน้าจอและกราฟิกสีพื้น สำหรับภาพถ่ายที่บันทึกเป็น BMP การใช้ JPEG หรือ WebP ที่คุณภาพดีจะได้สตริงที่สั้นลงไปอีก ขนาดต้นฉบับและขนาดหลังเข้ารหัสที่แสดงสำหรับแต่ละภาพช่วยให้เห็นความแตกต่างได้ง่าย

เมื่อใดควรคงไฟล์ BMP ต้นฉบับไว้

ระบบปลายทางบางระบบต้องการบิตแมปจริง ๆ เช่น ซอฟต์แวร์ Windows รุ่นเก่า เครื่องพิมพ์ฉลากและใบเสร็จ จอแสดงผลขนาดเล็กที่ควบคุมด้วยไมโครคอนโทรลเลอร์ หรือไฟล์ทดสอบที่ต้องตรงกับไฟล์อ้างอิงทุกไบต์ ในกรณีเหล่านี้ให้เลือก “คงรูปแบบเดิม” เอาต์พุต Base64 จะเป็นสำเนาที่ตรงกับไฟล์ทุกประการ เบราว์เซอร์หลักทุกตัวแสดงรูปภาพ data:image/bmp ได้ แต่สำหรับหน้าเว็บและอีเมล 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()

คำถามที่พบบ่อย

ทำไมสตริง Base64 ของ BMP จึงยาวมาก

BMP จัดเก็บทุกพิกเซลโดยไม่บีบอัด และ Base64 ยังเพิ่มขนาดอีกหนึ่งในสาม การแปลงเป็น PNG ก่อนมักทำให้สตริงสั้นลงอย่างมากโดยไม่สูญเสียรายละเอียดใด ๆ

การแปลง BMP เป็น PNG ทำให้คุณภาพลดลงหรือไม่

ไม่ลดลง PNG เป็นรูปแบบไม่สูญเสียข้อมูล พิกเซลจึงเหมือนเดิม มีเพียงวิธีจัดเก็บเท่านั้นที่เปลี่ยนไป

เบราว์เซอร์แสดง URI แบบ data:image/bmp ได้หรือไม่

ได้ Chrome, Edge, Firefox และ Safari แสดง BMP ได้ทั้งหมด แต่โปรแกรมอีเมลและแพลตฟอร์มออนไลน์จำนวนมากรองรับได้ไม่ค่อยดีนัก ในกรณีนั้น PNG จึงเป็นตัวเลือกที่ปลอดภัยกว่า

BMP รองรับความโปร่งใสหรือไม่

BMP แบบ 32 บิตเก็บช่องอัลฟาได้ แต่โปรแกรมและเบราว์เซอร์ต่าง ๆ จัดการกับช่องนี้ไม่สอดคล้องกัน หากต้องการความโปร่งใส ให้แปลงเป็น PNG หรือ WebP