之前一直很疑惑cv2的图像编码方法是如何使用的,做个总结。
_, enc = cv2.imencode('.jpg', img)
这个方法需要特别注意,img一定是一个BGR格式的uint8 ndarray。
demo code:
from PIL import Image
import numpy as np
import cv2
import base64
from io import BytesIO
image = Image.open('./mis_images/开蓬/aa0b87ffd1623ed68417f80a2f84291d.jpg')
image = np.asarray(image)
def ndarray2b64(img, format='rgb'):
if format == 'rgb':
_, enc = cv2.imencode('.jpg', img[..., ::-1])
elif format == 'bgr':
_, enc = cv2.imencode('.jpg', img)
b64 = base64.urlsafe_b64encode(enc.tobytes())
return b64
image_b64 = str(ndarray2b64(image), encoding='utf-8')
c_img = Image.open(BytesIO(base64.b64decode(image_b64)))
c_img.save('./out1.jpg')
最终得到的out1.jpg才是正确的。