Hướng dẫn base64 image php - hình ảnh cơ sở64 php

Chuyển đến nội dung

Có nhiều giải pháp để mã hoá hình ảnh, Encode Base64 là một trong số đó. Khi chuyển hình ảnh về dạng này ảnh được hiển thị trực tiếp từ Encode Base64 Image mà không qua URL ban đầu, điều này có nghĩa là sau khi bạn đã mã hoá thì bạn sẽ dùng code đã mã hoá này thay thế cho link ảnh ban đầu.

Cách mã hoá này có ưu điểm là giúp bạn tránh được việc link ảnh bị die, hiển thị hình ảnh nhanh hơn và không sợ bị lỗi liên quan đến https. Tuy nhiên, nó cũng có nhược điểm là khi bạn dùng để hiển thị ảnh code in ra sẽ dài và nặng hơn.

Một chút giới thiệu về cách mã hoá này thôi. Bây giờ ta tiến hành thực hiện, các bạn làm theo hướng dẫn bên dưới.

//C1: dùng trên host
$path = "myfolder/myimage.png"; 'duong-dan-ảnh-trên-host
$type = pathinfo($path, PATHINFO_EXTENSION);

//C2: dùng từ URL get content về rồi mã hoá
$path = "http(s)://mydomain.com/myimage.png"; 'duong-dan-ảnh-từ-web
$headers = get_headers($path, 1);
$type = $headers["Content-Type"];

$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
//KQ => ảnh đã được encode sang base64

Code trên hoạt động bằng cách lấy content và header (để xem type ảnh) của ảnh rồi sao đó đưa vào phần mã hoá trả về kết quả $base64.

DEMO:

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

Chào mọi người, trong bài viết hôm nay mình xin cố gắng đi sâu vào một khái niệm mà có lẽ tất cả chúng ta đã từng gặp và sử dụng khá nhiều trong công việc đặc biệt là trong các thao tác với files và ảnh. Đó là khái niệm base64 hay thường được gọi đầy đủ là base64 encoding có thể nhiều khi bạn cũng từng thắc mắc là làm sao chúng ta có thể upload một file ảnh, làm sao để lưu được một ảnh vào trong database thay vì chỉ lưu đường dẫn của ảnh đó. Đôi khi cố gắng tìm hiểu một thứ gì đó cũ cũ cũng khá là thú vị

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

1. Khái niệm

base64 là phương thức convert dạng mã hóa 2 chiều từ binary sang string để có thể gửi đi được trong network một cách dễ dàng. Các binary lúc này sẽ được thể hiện bằng các ký tự mã ASCII . là phương thức convert dạng mã hóa 2 chiều từ binary sang string để có thể gửi đi được trong network một cách dễ dàng. Các binary lúc này sẽ được thể hiện bằng các ký tự mã ASCII .

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

Sự ra đời của base64 bắt nguồn từ việc mong muốn gửi một ảnh quả Email dùng chuẩn SMPT, tuy nhiên chuẩn SMTP chỉ cho phép chuyển các ký tự ASCII dùng 7 bit có giá trị từ 0- 127. Nhưng một tệp nhị phân bao gồm các byte có giá trị 0-255 vậy trước tiên chúng ta cần convert nó để có thể sử dụng được SMTP.

Rõ ràng mã ASCII có 128 giá trị nhưng tại sao lại là base64 mà không phải base128, đơn giản là vì không phải 128 mã ASCII đều có thể được sử dụng. Ví dụ CR/LF tương ứng là 13 và 10 trong mã ASCII được sử dụng để biểu thị việc kết thúc dòng trong SMTP cho nên việc sử dụng cặp ký tự này là không cần thiết và còn nhiều cặp tương tự như vậy nên thay vì sử dụng 128 (7bits) chúng ta sẽ sử dụng 64 (6 bits) để thể hiện dữ liệu.

2. Base64 hoạt động như thế nào?

Để hiểu hơn và khái niệm base64 mà không phải

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

3 octet lại tạo ra 4 ký tự

Bảng mã convert base64 [a-zA-Z0-9+/]

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

Cùng xem qua ví dụ sau để hiểu rõ hơn về cách convert của base64 nhé. Giả sử chúng ta có string là: ravrav

Binary tương ứng của string trên là : 01110010 01100001 01110110

Bước đầu tiên là chúng ta chia 3 octet trên thành nhóm 6 bít

Binary 011100 100110 000101 110110

Từ đó số thập phân tưng ứng với 4 nhóm mới sẽ là : 28 38 5 54

Từ bảng trên chúng ta sẽ có được chuỗi ký tự sau khi mã hóa tương ứng như sau:

28 = c

38 = m

5 = F

54 = 2

Vì thế rav sau khi qua base64 sẽ thành cmF2rav sau khi qua base64 sẽ thành cmF2

Nhưng điều gì sẽ sảy ra nếu số byte không chia hết cho 3, ví dụ 4 byte thì chúng ta sẽ có tất cả 4x8=32 bits. Sau khi chia làm từng nhóm 6 bits chúng ta sẽ được 5 nhóm và còn thiếu 4 bit để đủ 1 nhóm.

Ví dụ với string : raverave

Binary - 01110010 01100001 01110110 01100101

3 byte đầu tiên của chúng tôi mã hóa giống nhau. Nhưng 8 bit cuối cùng không phân chia hết. Vì vậy, để mã hóa trong base64 chúng ta thực cần 12 bit. Các bit còn lại được đệm bằng số không. Cái kết như sau :

Binary 01110010 01100001 01110110 01100101 011001 010000

Decimal 25 16

Base64 Z Q

Nhưng dù thêm hay bớt, có vay có trả chúng ta vẫn thiếu 2 ký tự, cho nên kết thúc chuỗi mã hóa chúng ta phải có ký tự đệm cho nó. trong MIME RFC ký tự đệm là ==

Kết quả sau khi mã hóa base64 chúng ta được : cmF2ZQ==cmF2ZQ==

Cuối cùng chúng ta có thể thấy cứ 3 byte lại bị mã hóa thành 4 ký tự cho nên việc gửi mail hoặc gửi ảnh bị giới hạn dung lượng cũng vì lẽ đó, hoặc chúng ta không nên lưu trực tiếp base64 vào database cho dù điều đó là có thể.

3. Kết luận

Trên đây là một số tìm hiểu của mình về base64 và còn khá nhiều kiến thức xoay quanh nó mà mình chưa ngâm cứu hết được. Hy vọng thông qua bài viết này các bạn đã phần nào hiểu được thứ mà vẫn chung chăn gối với mình bấy lâu nay. Mọi kiến thức đều là đi nhặt lượm nên chỗ nào nhặt chưa sạch thì cũng mong các bạn thông cảm. Cảm ơn các bạn đã đón đọc

Hướng dẫn base64 image php - hình ảnh cơ sở64 php

4. Tài liệu tham khảo

https://en.wikipedia.org/wiki/Base64

https://www.quora.com/Why-do-we-use-Base64