PIL、base64与cv2 图片格式之间的转换
在做图像算法的过程中,经常遇上,要对图像格式进行转换,来处理图像。下面代码示例为 PIL、base64 与 cv2 图像格式之间的转换:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# ============================================
# @Time : 2019/11/04 10:15
# @Author : WanDaoYi
# @FileName : image_str_util.py
# ============================================
from PIL import Image
import base64
from io import BytesIO
import cv2
import numpy as np
# image 转 base64
def img_base64(image):
base64_str = base64.b64encode(image)
return base64_str
pass
# base64 转 cv2
def base64_cv2(base64_str):
image_str = base64.b64decode(base64_str)
str_array = np.fromstring(image_str, np.uint8)
cv2_image = cv2.imdecode(str_array, cv2.IMREAD_COLOR)
return cv2_image
pass
# cv2 转 base64
def cv2_base64(image):
image_str = cv2.imencode(".jpg", image)[1].tostring()
base64_str = base64.b64encode(image_str)
return base64_str
pass
# base64 转 pil
def base64_pil(base64_str):
image_str = base64.b64decode(base64_str)
image_byte = BytesIO(image_str)
pil_image = Image.open(image_byte)
return pil_image
pass
# pil 转 base64
def pil_base64(image):
img_buffer = BytesIO()
image.save(img_buffer, format="JPEG")
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data)
return base64_str
pass
# cv2 转 pil
def cv2_pil(cv2_image):
pil_image = Image.fromarray(cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB))
return pil_image
pass
# pil 转 cv2
def pil_cv2(pil_image):
cv2_image = cv2.cvtColor(np.asarray(pil_image), cv2.COLOR_RGB2BGR)
return cv2_image
pass
if __name__ == "__main__":
image_path = "zhaoyihuan.jpg"
image = cv2.imread(image_path)
h, w = image.shape[: 2]
cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.resizeWindow("image", w // 2, h // 2)
cv2.imshow("image", image)
base64_str = cv2_base64(image)
# print("base64_str: {}".format(base64_str))
new_cv2_image = base64_cv2(base64_str)
# print("new_cv2_image: {}".format(new_cv2_image))
h_new, w_new = new_cv2_image.shape[: 2]
cv2.namedWindow("new_cv2_image", cv2.WINDOW_NORMAL)
cv2.resizeWindow("new_cv2_image", w_new // 2, h_new // 2)
cv2.imshow("new_cv2_image", new_cv2_image)
pil_image = base64_pil(base64_str)
# pil_image.show()
base64_str = pil_base64(pil_image)
# print("base64_str: {}".format(base64_str))
cv2_pil_image = cv2_pil(image)
# cv2_pil_image.show()
pil_cv2_image = pil_cv2(pil_image)
h_pil_cv2, w_pil_cv2 = pil_cv2_image.shape[: 2]
cv2.namedWindow("pil_cv2_image", cv2.WINDOW_NORMAL)
cv2.resizeWindow("pil_cv2_image", w_pil_cv2 // 2, h_pil_cv2 // 2)
cv2.imshow("pil_cv2_image", pil_cv2_image)
cv2.waitKey(0)
pass