Gọi là ảnh base64 vì những pixel value của ảnh đã convert từ 8bit sang 6bit. 6 bit thì có 64 giá trị, do đó gọi là ảnh base64. Base64 là phương thức mã hóa, do đó có thể sử dụng với video, nhạc hay bất cứ file gì.
Ảnh base64 được sử dụng trong vài trường hợp như truyền/nhận ảnh từ các chương trình khác nhau. Bản chất của ảnh base64 là 1 đoạn text có giá trị từ A-Z, a-z, 0-1, ký tự + với ký tự /. Do đó việc gửi ảnh đi giống như gửi 1 chuỗi text đơn thuần. Khi mã hóa & giải mã cũng nhanh, phù hợp cho các ứng dụng cần sự đơn giản trong giao thức truyền nhận.
Và do ảnh base64 chỉ là text nên có thể nhúng thẳng vào source code HTML.
Bản thân mình sử dụng ảnh base64 để tránh việc ảnh gửi đi không đọc được. Thường là gửi từ hệ điều hành này sang hệ điều hành khác, như Android qua Windows chẳng hạn.
Thuật toán mã hóa ảnh thành ảnh base64
Các giá trị từ 0 đến 64 tương ứng với các ký tự alphabet thống thường:
A-Z là từ 0 đến 25
a-z là từ 26 đến 51
0-9 là từ 52 đến 61
Dấu + là giá trị 62
Dấu / là giá trị 63
Như vậy thuật toán chuyển sang base64 sẽ đọc nội dung file binary, cứ gom cụm 6bit thành 1 nhóm rồi chuyển thành giá trị tương ứng. Kết quả là chuỗi text với các ký tự ở trên.
Và thuật toán giải mã đơn giản là làm ngược lại, cứ lấy các ký tự ghi lại thành nhị phân sẽ được ảnh ban đầu.
Làm sao kiểm tra ảnh base64 hợp lệ?
Dựa theo thuật toán trên thì ảnh hay file base64 có các tính chất sau:
– Không được rỗng (tất nhiên)
– Chỉ chứa 64 ký tự quy định
– Số lượng ký tự (hay là chiều dài chuỗi) phải chia hết cho 4
Như vậy có thể viết hàm kiểm tra đơn giản như sau (C#)
1 2 3 4 5 6 7 8 |
bool IsBase64(string base64String) { if (base64String == null || base64String.Length == 0 || base64String.Length % 4 != 0 || base64String.Contains(" ") || base64String.Contains("\t") || base64String.Contains("\r") || base64String.Contains("\n")) return false; return true; } |
Bước này nhằm kiểm tra ảnh base64 có hợp lệ hay không. Còn giải mã được hay không thì phải convert từng byte mới biết được.
Các trang web encode/decode base64
Các trang web bên dưới giúp bạn chuyển đổi ảnh hoặc text sang dạng base64.
Encode image: https://www.base64-image.de/
Encode text: https://www.base64encode.org/
Để nhúng vào file html, bạn chỉ cần truyền ảnh base64 vào tham số src của tag là được. Ví dụ như file soc_chuot.html
Code mã hóa/giải mã base64 C++
[bg_collapse view=”button-orange” color=”#4a4949″ expand_text=”Show More” collapse_text=”Show Less” ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; std::string TGMTcrypto::EncodeBase64(std::string value) { byte *bytes_to_encode;// = new byte(value.length()); //strcpy((char*)bytes_to_encode, value.c_str()); bytes_to_encode = (byte*)value.c_str(); int in_len = value.length(); std::string ret; int i = 0; int j = 0; byte char_array_3[3]; byte char_array_4[4]; while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; (i < 4); i++) ret += base64_chars[char_array_4[i]]; i = 0; } } if (i) { for (j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; while ((i++ < 3)) ret += '='; } return ret; } /////////////////////////////////////////////////////////////////////////////////////////////////// std::string TGMTcrypto::DecodeBase64(std::string encoded_string) { int in_len = encoded_string.size(); int i = 0; int j = 0; int in_ = 0; unsigned char char_array_4[4], char_array_3[3]; std::string ret; while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { char_array_4[i++] = encoded_string[in_]; in_++; if (i == 4) { for (i = 0; i < 4; i++) char_array_4[i] = base64_chars.find(char_array_4[i]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (i = 0; (i < 3); i++) { ret += char_array_3[i]; } i = 0; } } if (i) { for (j = i; j < 4; j++) char_array_4[j] = 0; for (j = 0; j < 4; j++) char_array_4[j] = base64_chars.find(char_array_4[j]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; } return ret; } |
Code mã hóa/giải mã base64 C#
C# có sẵn hàm convert nên không cần viết lại, chỉ cần gọi ra sử dụng
[bg_collapse view=”button-orange” color=”#4a4949″ expand_text=”Show More” collapse_text=”Show Less” ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static Image Base64ToImage(string base64String) { byte[] imageBytes = Convert.FromBase64String(base64String); using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length)) { Image image = Image.FromStream(ms, true); return image; } } //////////////////////////////////////////////////////////////////////////////////////////////////// public static string ImageToBase64(Image image) { using (MemoryStream ms = new MemoryStream()) { // Convert Image to byte[] image.Save(ms, image.RawFormat); byte[] imageBytes = ms.ToArray(); // Convert byte[] to base 64 string return base64String; } } |