PIL là Thư viện hình ảnh Python cung cấp trình thông dịch python với khả năng chỉnh sửa hình ảnh. Mô-đun Image
cung cấp một lớp có cùng tên được sử dụng để thể hiện hình ảnh PIL. Mô-đun này cũng cung cấp một số chức năng xuất xưởng, bao gồm chức năng tải hình ảnh từ tệp và tạo hình ảnh mới
Đôi khi, chúng tôi có thể muốn một hình ảnh jpg hoặc png trong bộ nhớ được biểu thị dưới dạng dữ liệu nhị phân. Nhưng thông thường, những gì chúng ta có là hình ảnh ở định dạng OpenCV [Numpy ndarray] hoặc PIL Image. Trong bài đăng này, tôi sẽ chia sẻ cách chuyển đổi hình ảnh Numpy hoặc đối tượng PIL Image thành dữ liệu nhị phân mà không lưu hình ảnh bên dưới vào đĩa
Nếu tệp hình ảnh được lưu trên đĩa, chúng ta có thể đọc nó trực tiếp ở định dạng nhị phân bằng phương pháp open[]
bằng cách sử dụng cờ b
with open['test.jpg', 'rb'] as f:
byte_im = f.read[]
Bây giờ hình ảnh sẽ được đọc từ đĩa vào bộ nhớ và vẫn ở định dạng nhị phân
Điều gì sẽ xảy ra nếu chúng ta muốn thay đổi kích thước hình ảnh gốc và chuyển đổi nó thành dữ liệu nhị phân mà không lưu hình ảnh đã thay đổi kích thước và đọc lại từ đĩa cứng?
Chúng tôi có thể làm điều đó với sự trợ giúp của OpenCV hoặc PIL
OpenCV
Đây là cách để đạt được điều đó trong OpenCV
import cv2
im = cv2.imread['test.jpg']
im_resize = cv2.resize[im, [500, 500]]
is_success, im_buf_arr = cv2.imencode[".jpg", im_resize]
byte_im = im_buf_arr.tobytes[]
# or using BytesIO
# io_buf = io.BytesIO[im_buf_arr]
# byte_im = io_buf.getvalue[]
Một lời giải thích nhỏ ở đây. sẽ mã hóa Numpy ndarray theo định dạng đã chỉ định. Phương thức này sẽ trả về hai giá trị, giá trị đầu tiên là liệu thao tác có thành công hay không và giá trị thứ hai là hình ảnh được mã hóa trong mảng Numpy một chiều
Sau đó, bạn có thể chuyển đổi mảng được trả về thành byte thực bằng phương thức tobytes[]
hoặc. Cuối cùng chúng ta cũng có thể nhận được byte_im
. Tương tự với việc lưu hình ảnh đã thay đổi kích thước vào đĩa cứng và sau đó đọc nó ở định dạng nhị phân, nhưng bước lưu bị loại bỏ và tất cả thao tác được thực hiện trong bộ nhớ
PIL
Nếu bạn thích sử dụng PIL để xử lý ảnh. Bạn có thể sử dụng đoạn mã sau
import io
from PIL import Image
im = Image.open['test.jpg']
im_resize = im.resize[[500, 500]]
buf = io.BytesIO[]
im_resize.save[buf, format='JPEG']
byte_im = buf.getvalue[]
Trong đoạn code trên, chúng ta lưu đối tượng im_resize
Image vào đối tượng
import cv2
im = cv2.imread['test.jpg']
im_resize = cv2.resize[im, [500, 500]]
is_success, im_buf_arr = cv2.imencode[".jpg", im_resize]
byte_im = im_buf_arr.tobytes[]
# or using BytesIO
# io_buf = io.BytesIO[im_buf_arr]
# byte_im = io_buf.getvalue[]
0 import cv2
im = cv2.imread['test.jpg']
im_resize = cv2.resize[im, [500, 500]]
is_success, im_buf_arr = cv2.imencode[".jpg", im_resize]
byte_im = im_buf_arr.tobytes[]
# or using BytesIO
# io_buf = io.BytesIO[im_buf_arr]
# byte_im = io_buf.getvalue[]
1. Lưu ý trường hợp này bạn phải chỉ định lưu vì PIL không biết định dạng ảnh trong trường hợp này. Chuỗi byte có thể được truy xuất bằng cách sử dụng phương pháp import cv2
im = cv2.imread['test.jpg']
im_resize = cv2.resize[im, [500, 500]]
is_success, im_buf_arr = cv2.imencode[".jpg", im_resize]
byte_im = im_buf_arr.tobytes[]
# or using BytesIO
# io_buf = io.BytesIO[im_buf_arr]
# byte_im = io_buf.getvalue[]
2 của biến import cv2
im = cv2.imread['test.jpg']
im_resize = cv2.resize[im, [500, 500]]
is_success, im_buf_arr = cv2.imencode[".jpg", im_resize]
byte_im = im_buf_arr.tobytes[]
# or using BytesIO
# io_buf = io.BytesIO[im_buf_arr]
# byte_im = io_buf.getvalue[]
1