Trình Chuyển Đổi Hình Ảnh Sang Base64

Chuyển đổi bất kỳ hình ảnh nào sang chuỗi Base64 hoặc URI dữ liệu.

Kéo-thả một hình ảnh vào đây, hoặc nhấp để chọn

PNG, JPG, GIF, SVG, WebP

Về hình ảnh sang Base64

Mã hóa Base64 chuyển đổi dữ liệu nhị phân của một hình ảnh thành văn bản ASCII, điều này cho phép tích hợp trực tiếp các hình ảnh vào HTML, CSS hoặc JSON mà không cần các tệp bên ngoài. Định dạng URI dữ liệu (data:image/png;base64,…) có thể được sử dụng trong các thuộc tính src của <img> và các thuộc tính CSS background-image. Lưu ý: các hình ảnh được mã hóa trong Base64 lớn hơn khoảng 33% so với tệp gốc.

Cách Hoạt Động

  1. Kéo thả hoặc chọn ảnh. Trình duyệt đọc tệp cục bộ bằng API FileReader. Không có gì được tải lên đâu cả.
  2. Bộ mã hóa chuyển đổi các byte sử dụng bảng chữ cái Base64 chuẩn, cứ 3 byte đầu vào thành 4 ký tự ASCII lấy từ A-Z a-z 0-9 + /, với tối đa hai ký tự đệm = ở cuối khi độ dài đầu vào không phải bội số của 3.
  3. Sao chép những gì bạn cần. «Sao chép Base64» cho bạn chỉ chuỗi mã hóa (hữu ích cho JSON payload hoặc xử lý backend). «Sao chép Data URI» cho bạn dạng đầy đủ data:image/png;base64,… sẵn sàng chèn vào thuộc tính <img src> hoặc CSS background-image: url(…).
  4. Dán vào nơi cần thiết. Đầu ra là văn bản thuần túy, dùng được trong HTML, CSS, JSON, JavaScript, Markdown, hoặc bất kỳ nơi nào có thể chứa chuỗi ký tự.

Base64 Thực Sự Làm Gì

Base64 được định nghĩa trong RFC 4648 (tháng 10 năm 2006). Mã hóa lấy 24 bit đầu vào một lần (ba byte) và viết lại thành bốn chỉ số 6-bit vào bảng chữ cái 64 ký tự. Toán học chính xác: 3 byte (24 bit) → 4 ký tự (mỗi ký tự mang 6 bit). Khi độ dài đầu vào không phải bội số của 3, bộ mã hóa thêm ký tự đệm = để làm cho độ dài đầu ra là bội số của 4.

Hai hệ quả thực tế:

RFC 4648 §12 nêu rõ một điểm không phải tính năng quan trọng: «Mã hóa Base64 che giấu thông tin dễ nhận biết về mặt hình thức, chẳng hạn như mật khẩu, nhưng không cung cấp tính bảo mật tính toán.» Bất kỳ ai cũng có thể giải mã chuỗi Base64 trong hai dòng code ở bất kỳ ngôn ngữ nào. Đây là mã hóa, không phải mã mật.

Data URI: Dạng Ảnh Nội Tuyến

«data URI» là định dạng bọc cho phép chuỗi Base64 thay thế URL ảnh. RFC 2397 (1998) định nghĩa cú pháp:

data:[<mediatype>][;base64],<data>

Với ảnh, điều đó có nghĩa là data:image/png;base64,iVBORw0KGgo… trong thuộc tính <img src> hoặc background-image: url("data:image/svg+xml;utf8,<svg…>") trong CSS. Token ;base64 cho trình duyệt biết phần dữ liệu được mã hóa; nếu không có nó, dữ liệu được coi là văn bản percent-encoded. RFC 2397 chính nó lưu ý rằng data URI «chỉ hữu ích cho các giá trị ngắn», một gợi ý đã trở thành quy tắc hiệu suất cứng rắn.

Khi Nào Nên Nhúng Ảnh Dạng Base64

Khi Nào Không Nên Nhúng Ảnh Dạng Base64

Với hầu hết các trang web sản xuất, ảnh Base64 nội tuyến chậm hơn tham chiếu <img> thông thường. Năm lý do cộng hưởng:

  1. Chi phí kích thước 33%, luôn luôn. Mỗi byte tốn 4/3 byte sau khi mã hóa. Khi gzip được áp dụng, chi phí rõ ràng giảm (vì Base64 có tính lặp lại), nhưng các byte trình duyệt phân tích vẫn lớn hơn 33% so với bản gốc.
  2. Ảnh không thể được cache riêng biệt. image.png bên ngoài được tải một lần và tái sử dụng trên mọi trang liên kết đến nó. Ảnh Base64 sống trong HTML hoặc CSS và được tải lại với mỗi thay đổi trên tệp đó.
  3. Làm chậm phân tích HTML và CSS. Chuỗi nội tuyến dài bên trong CSS chặn render đẩy đường dẫn quan trọng ra xa hơn. Harry Roberts (CSS Wizardry) đo stylesheet client thực tế ở 925 KB với ảnh Base64 so với 708 KB không có, và 232 KB sau gzip so với 68 KB. Xóa Base64 cắt giảm CSS sau gzip đi 70,68%.
  4. Không thể lazy-load. Thuộc tính loading="lazy" trì hoãn tải ảnh cho đến khi người dùng cuộn gần nó. Ảnh Base64 đã có sẵn trong tài liệu, không có gì để trì hoãn.
  5. HTTP/2 và HTTP/3 đã giải quyết vấn đề «quá nhiều yêu cầu» rồi. Multiplexing cho phép một kết nối duy nhất phân phối hàng trăm tệp song song, vì vậy lý do ban đầu để nội tuyến phần lớn đã không còn nữa.

Quy tắc thực tế từ Google PageSpeed và hầu hết các tác giả về hiệu suất: chỉ nội tuyến nếu ảnh nhỏ hơn ~1-2 KB sau mã hóa, và chỉ nếu nó xuất hiện trên phần nhìn thấy đầu tiên trong CSS quan trọng. Bất cứ thứ gì lớn hơn hầu như chắc chắn hoạt động tốt hơn dưới dạng tệp riêng biệt.

SVG: Dùng Mã Hóa UTF-8, Không Dùng Base64

SVG đã là văn bản, vì vậy mã hóa nó dưới dạng Base64 lãng phí ~33% byte mà không có lợi ích gì. Dạng nhỏ hơn là UTF-8 được URL-encode:

/* Base64 SVG (longer) */
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0i…");

/* URL-encoded SVG (shorter, also human-readable) */
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' …>");

Hầu hết các công cụ build hiện đại (PostCSS' postcss-inline-svg, Webpack's svg-url-loader) phát ra dạng URL-encoded theo mặc định. Với SVG nội tuyến, ưu tiên dạng đó hơn Base64 trừ khi consumer cụ thể yêu cầu ;base64.

Các Kiểu MIME Công Cụ Này Nhận Biết

Tiền tố loại media của data URI cho consumer biết cách giải thích các byte. Trình duyệt phát hiện nó từ tệp bạn chọn:

TệpTiền tố MIME
PNGdata:image/png;base64,…
JPEGdata:image/jpeg;base64,…
GIFdata:image/gif;base64,…
SVGdata:image/svg+xml;base64,… (xem xét dùng URL-encoding thay thế)
WebPdata:image/webp;base64,…
AVIFdata:image/avif;base64,…
BMPdata:image/bmp;base64,…
ICOdata:image/x-icon;base64,…

Ghi Chú Bảo Mật và Quyền Riêng Tư

Hầu hết các trang web «chuyển ảnh sang Base64» trực tuyến tải tệp của bạn lên máy chủ của họ, mã hóa ở đó và trả về kết quả. Điều đó có nghĩa là ảnh chụp màn hình UI tiền phát hành, thiết kế NDA, ảnh trẻ em, kết quả quét y tế, hoặc chữ ký trên hợp đồng đi qua cơ sở hạ tầng của bên thứ ba. Công cụ này mã hóa cục bộ, FileReader của trình duyệt đọc tệp vào bộ nhớ, bộ mã hóa chạy trong JavaScript trên thiết bị của bạn, và điều duy nhất rời khỏi trang là chuỗi mã hóa khi bạn sao chép.

Hai lưu ý về Content Security Policy đáng biết nếu bạn triển khai ảnh Base64 trong production:

Các Lỗi Phổ Biến

  1. Coi Base64 là che giấu. Không phải vậy. Bất kỳ ai cũng có thể giải mã nó trong hai dòng ở bất kỳ ngôn ngữ nào. Đừng đặt thông tin xác thực, API key, hoặc dữ liệu nhạy cảm vào chuỗi Base64 «để che giấu chúng.»
  2. Nhúng hero image 200 KB. Ảnh trở thành 266 KB sau mã hóa, bị kẹt trong HTML, không thể cache riêng biệt, không thể lazy-load, và lần sơn đầu tiên của trang chậm lại rõ rệt. Hãy phục vụ nó như một tệp thông thường.
  3. Sao chép Base64 thô khi bạn cần data URI. Chuỗi Base64 trần trong thuộc tính <img src> hiển thị bị hỏng, bạn cần tiền tố data:image/png;base64,. Dùng nút «Sao chép Data URI».
  4. Mã hóa Base64 cho SVG. SVG đã là văn bản. URL-encode nó thay thế và tiết kiệm chi phí 33%.
  5. Quên CSP. img-src 'self' nghiêm ngặt chặn data URI. Thêm data: vào directive nếu bạn triển khai ảnh Base64.
  6. Cố giải mã chuỗi Base64 với tiền tố data: đứng đầu. Phần data:image/...;base64, là metadata; hãy bỏ nó trước khi truyền chuỗi cho bộ giải mã Base64.
  7. Dán ảnh bảo mật vào bộ mã hóa phía máy chủ. Nếu URL nói «mã hóa» nhưng tab mạng hiển thị POST, ảnh của bạn vừa rời khỏi máy của bạn.

Câu Hỏi Thường Gặp

Sự khác biệt giữa «Base64» và «Data URI» là gì?

Base64 là mã hóa (một chuỗi như iVBORw0KGgo…. Data URI là lớp bọc biến chuỗi Base64 thành thứ có thể thay thế URL ảnh) data:image/png;base64,iVBORw0KGgo…. Lớp bọc cho trình duyệt biết loại media và cách mã hóa để biết cách giải thích các byte. Hai nút trong công cụ này cung cấp cho bạn từng dạng riêng biệt.

Base64 có an toàn không?

Không, và đó không phải mục đích của nó. Base64 là mã hóa, không phải mã mật. RFC 4648 §12 nêu trực tiếp: nó «không cung cấp tính bảo mật tính toán.» Bất kỳ ai cũng có thể giải mã chuỗi Base64 ngay lập tức. Nếu bạn cần riêng tư, hãy mã mật dữ liệu trước (với AES, v.v.) rồi Base64 bản mã để truyền tải.

Ảnh có thể lớn đến đâu?

Không có giới hạn cứng nào được áp đặt bởi công cụ, vì mã hóa xảy ra trong bộ nhớ trình duyệt. Giới hạn thực tế là bất cứ thứ gì thiết bị của bạn có thể chứa, thường là hàng chục MB trên laptop hiện đại. Ràng buộc lớn hơn là hỗ trợ consumer: nhiều email client, trình duyệt và API có giới hạn kích thước data URI riêng, và nội tuyến bất cứ thứ gì trên vài KB hiếm khi có ý nghĩa về hiệu suất.

Tại sao chuỗi Base64 của tôi lớn hơn tệp 33%?

Vì mỗi ký tự Base64 mang 6 bit, trong khi mỗi byte đầu vào mang 8 bit. Đơn vị nhỏ nhất Base64 có thể biểu diễn không dư là 3 byte (24 bit = bốn ký tự 6-bit), vì vậy tỉ lệ đầu ra chính xác là 4/3 ≈ 1,33. Không có biến thể Base64 nào tránh được điều này, nó được tích hợp về mặt toán học vào mã hóa.

Ảnh đã mã hóa có hoạt động trong email HTML không?

Hầu hết, nhưng không phải lúc nào. Apple Mail, Gmail hiện đại và hầu hết webmail client hiển thị ảnh data: sạch sẽ. Microsoft Outlook desktop lịch sử có hỗ trợ không nhất quán, một số phiên bản hiển thị data URI tốt, các phiên bản khác loại bỏ hoàn toàn. Kiểm tra trong danh sách client mục tiêu của bạn trước khi dựa vào ảnh Base64 trong email giao dịch. Để tương thích rộng, URL ảnh được lưu trữ vẫn là lựa chọn an toàn hơn.

Tôi có nên dùng base64url (với - và _) thay thế không?

Chỉ nếu bạn đặt dữ liệu đã mã hóa vào URL hoặc tên tệp nơi +/ nếu không sẽ cần percent-encoding. Với thuộc tính HTML <img src> và giá trị CSS background-image, bảng chữ cái chuẩn hoạt động tốt. RFC 4648 §5 định nghĩa biến thể an toàn URL rõ ràng cho các trường hợp URL/tên tệp đó, và cảnh báo rằng nó «không nên được gọi là chỉ 'base64'» để tránh nhầm lẫn với bảng chữ cái chuẩn.

Công cụ liên quan