Trình giải mã hình ảnh Base64

Dán một chuỗi Base64 để xem trước và tải xuống hình ảnh.

Dữ liệu của bạn không rời khỏi thiết bị
Hình ảnh đã giải mã sẽ xuất hiện ở đây

Cách sử dụng

  1. Dán một chuỗi hình ảnh được mã hóa Base64 vào khu vực nhập. Nó có thể bao gồm tiền tố data:image/… hoặc chỉ chứa dữ liệu Base64 thô.
  2. Nhấp vào Giải mã hình ảnh để xem trước.
  3. Nhấp vào Tải xuống hình ảnh để lưu thành tệp PNG.

Câu hỏi thường gặp

Các định dạng Base64 nào được hỗ trợ?

Bạn có thể dán một chuỗi Base64 thô (công cụ tự động phát hiện định dạng) hoặc một URI dữ liệu đầy đủ như data:image/png;base64,iVBOR…. Các loại hình ảnh được hỗ trợ: PNG, JPEG, WebP, GIF, BMP và SVG.

Có giới hạn kích thước không?

Không có giới hạn cứng, nhưng các chuỗi Base64 rất lớn (hơn 5–10 MB) có thể mất thời gian để xử lý tùy thuộc vào thiết bị của bạn.

Cách mã hóa hình ảnh thành Base64?

Sử dụng công cụ Trình Chuyển Đổi Hình Ảnh Sang Base64 của chúng tôi · chỉ cần kéo-thả một hình ảnh để có chuỗi Base64 của nó.

Base64 thực sự là gì

Base64 là một lược đồ mã hóa nhị phân sang văn bản được định nghĩa trong RFC 4648 (tháng 10 năm 2006). Nó dùng bảng chữ cái 64 ký tự, A-Z, a-z, 0-9, cộng với +/: để biểu diễn byte tùy ý dưới dạng ASCII in được. Cứ mỗi ba byte đầu vào nhị phân sẽ trở thành đúng bốn ký tự đầu ra, vì bội chung nhỏ nhất của 6 bit (một ký tự Base64) và 8 bit (một byte) là 24. Tỉ lệ bốn-trên-ba đó cũng là lý do tại sao một file được mã hóa Base64 lớn hơn nhị phân gốc khoảng 33%.

Khi độ dài đầu vào không phải bội số của ba, Base64 đệm thêm = để đầu ra luôn là bội số của bốn ký tự: một byte đuôi tạo ra hai ký tự cộng ==; hai byte đuôi tạo ra ba ký tự cộng =. Một số bộ mã hóa bỏ phần đệm, vì vậy một bộ giải mã vững chắc cần đệm lại trước khi truyền chuỗi vào atob().

RFC 4648 cũng định nghĩa một biến thể an toàn với URL (đôi khi gọi là base64url) hoán đổi + thành -/ thành _. JWT dùng biến thể này. Bộ giải mã này chuẩn hóa cả hai bảng chữ cái nên bạn không cần nghĩ xem mình đang nhận cái nào.

Lược đồ data URI

RFC 2397 (tháng 8 năm 1998) định nghĩa lược đồ URL data:. Cú pháp đầy đủ là:

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

Một PNG nội tuyến điển hình trông như data:image/png;base64,iVBORw0KGgo…. Token ;base64 là một dấu hiệu (lưu ý sự vắng mặt của dấu =) báo cho trình duyệt giải mã payload từ Base64 thay vì xử lý nó là văn bản mã hóa phần trăm. Nếu bạn bỏ ;base64, dữ liệu sẽ được hiểu là văn bản mã hóa URL. Nếu bạn bỏ hoàn toàn loại media, đặc tả mặc định là text/plain;charset=US-ASCII.

Bộ giải mã này chấp nhận cả hai dạng: dán data URI đầy đủ hoặc chỉ payload Base64. Khi chỉ cung cấp payload, định dạng được phát hiện từ các byte đầu tiên được giải mã, xem bên dưới.

Cách phát hiện định dạng

Nếu bạn dán một chuỗi Base64 thô không có tiền tố data:image/…, cách duy nhất để biết đó là loại ảnh gì là nhìn vào một vài byte đầu tiên được giải mã, mỗi định dạng ảnh phổ biến đều bắt đầu bằng một chữ ký nhận dạng được, chính thức gọi là «magic number». Các trình duyệt thực hiện đúng cách kiểm tra đó khi dò tìm MIME type (quy trình này có trong tiêu chuẩn WHATWG MIME Sniffing). Điểm tiện lợi là những chữ ký đó chuyển thành tiền tố Base64 có thể dự đoán được:

Định dạngByte đầu (hex)Tiền tố Base64
PNG89 50 4E 47 0D 0A 1A 0AiVBORw0KGgo
JPEGFF D8 FF/9j/
GIF89a47 49 46 38 39 61R0lGODlh
WebP52 49 46 46 … 57 45 42 50UklGR
BMP42 4D ("BM")Qk
SVG (văn bản XML)bắt đầu bằng <?xml hoặc <svgPD94bWwg hoặc PHN2Zw

Chữ ký của PNG là một trong những chữ ký khéo léo nhất trong vườn thú định dạng. Byte 89 có bit cao được đặt để bộ chuyển tiếp thư chỉ 7-bit sẽ làm hỏng nó một cách rõ ràng. Ba byte tiếp theo ghép thành PNG trong ASCII để người dùng chạy head trên file có thể nhận ra. Tiếp theo là ký tự kết thúc dòng DOS (0D 0A), Ctrl-Z của MS-DOS dừng lệnh TYPE cũ không in tiếp, và ký tự xuống dòng Unix (0A), cùng nhau chúng phát hiện mọi phương tiện truyền tải phổ biến «hữu ích» ghi đè các ký tự xuống dòng.

Base64 image đến từ đâu

Hầu hết những người dùng công cụ như thế này đều đang gỡ lỗi thứ gì đó. Các tình huống phổ biến:

Bạn có nên nhúng ảnh dưới dạng Base64 không?

Sự đánh đổi từng thú vị hơn. Dưới HTTP/1.1, mỗi ảnh là một yêu cầu chặn riêng biệt và nhúng một icon nhỏ có thể tiết kiệm được một lần round-trip thực sự. Dưới HTTP/2 và HTTP/3, tình huống này đã thu hẹp đáng kể. Tóm tắt thật thà:

Bạn được: không có yêu cầu HTTP thêm, phân phối nguyên tử, và các artifact tự đủ hoạt động không cần phụ thuộc bên ngoài (demo đơn file, email, PDF kết xuất phía máy chủ).

Bạn mất: trình duyệt không thể cache data URI nội tuyến riêng biệt, vì vậy cùng một ảnh trên mười trang được tải lại với mỗi phản hồi HTML. Asset được mã hóa lớn hơn khoảng 33% so với nhị phân tương đương. CDN không thể loại bỏ trùng lặp ảnh được nhúng trên các trang. Các pipeline tối ưu hóa ảnh (Cloudinary, Vercel, Next.js <Image>) không thể kiểm tra, nén, thay đổi kích thước hoặc phục vụ các định dạng hiện đại như AVIF hay WebP cho asset được nhúng. Trình duyệt cũng phải giải mã Base64 trước và ảnh sau, tốn thêm CPU cho mỗi lần kết xuất.

Quy tắc ngón tay cái hợp lý: nhúng ảnh nhỏ hơn khoảng 4 KB chỉ dùng ở một chỗ, placeholder một pixel, và ảnh cần di chuyển bên trong file tự đủ. Đừng nhúng bất cứ thứ gì dùng trên nhiều hơn một trang, bất cứ thứ gì lớn hơn khoảng 4 KB, bất cứ thứ gì nên được lazy-load, hay bất cứ thứ gì được hưởng lợi từ đàm phán định dạng.

Bảo mật: những gì Base64 không làm

Base64 là mã hóa, không phải mật mã. RFC 4648 §12 cảnh báo rõ ràng rằng nó «che giấu thị giác» dữ liệu nhưng không cung cấp «bảo mật tính toán», bất kỳ ai cũng có thể giải mã ngay lập tức. Đừng Base64-encode mật khẩu hay API key rồi nghĩ đó là biện pháp bảo mật.

Hai chi tiết bảo mật đáng biết:

Câu hỏi thêm

Tại sao chuỗi Base64 của tôi thất bại với «InvalidCharacterError»?

Ba nguyên nhân thường gặp: khoảng trắng hoặc ký tự xuống dòng lạc từ copy-paste (chuẩn MIME Base64 cũ hơn ngắt dòng tại 76 ký tự, mà atob() của JavaScript từ chối); Base64 an toàn với URL dùng -_ thay vì +/; hoặc phần đệm = đuôi bị cắt khiến độ dài không phải bội số của bốn. Bộ giải mã này làm sạch khoảng trắng, chuẩn hóa bảng chữ cái và đệm lại trước khi giải mã, nhưng các chuỗi bị hỏng nặng vẫn thất bại.

Tôi có mất chất lượng khi giải mã không?

Không. Giải mã là nghịch đảo chính xác của mã hóa, bạn lấy lại ảnh gốc byte theo byte. File tải xuống ở bất kỳ định dạng nào trong Base64 (PNG, JPEG, WebP, GIF, BMP hoặc SVG), không có bước mã hóa lại.

Data URI lớn nhất mà trình duyệt chấp nhận là bao nhiêu?

Theo MDN, giới hạn hiện tại vào khoảng 512 MB cho Chromium và Firefox, và khoảng 2 GB cho Safari/WebKit. Trong thực tế, nút cổ chai là bộ nhớ và CPU chứ không phải đặc tả URL, các lần dán trên khoảng 10 MB bắt đầu cảm thấy chậm chạp trên máy tính xách tay thông thường.

Có dữ liệu nào được gửi lên máy chủ không?

Không. Giải mã xảy ra hoàn toàn trong trình duyệt của bạn thông qua hàm atob() gốc và Blob hoặc data URI được gán cho thẻ <img>. Không có gì được tải lên; trang hoạt động ngoại tuyến sau khi đã tải.

Tại sao Base64 của mọi JPEG đều bắt đầu bằng /9j/?

Hầu hết mọi file JPEG trong thực tế đều bắt đầu bằng các byte FF D8 FF (dấu Start-Of-Image theo sau là một byte dấu khác). Khi bạn mã hóa Base64 ba byte tất cả đều là FF với D8 ở giữa, mẫu bit 11111111 11011000 11111111 chia thành các nhóm 6-bit 111111 111101 100011 111111: vị trí bảng chữ cái Base64 63, 61, 35, 63, ghép thành /9j/. Ký tự thứ tư sau đó thay đổi tùy thuộc vào dấu theo sau (E0 cho JFIF, E1 cho Exif), nhưng ba ký tự đầu là bất biến.

Công cụ liên quan

Trình Chuyển Đổi Hình Ảnh Sang Base64 Trình mã hóa & giải mã Base64 miễn phí trực tuyến Công cụ Nén Hình Ảnh Trực Tuyến Miễn Phí