
cv2.imdecode 和 cv2.imencode 是 OpenCV 库中的两个重要函数,用于图像的编码和解码。
cv2.imdecode # 解码器cv2.imdecode 函数用于将一个字节流解码为图像。它可以处理多种图像格式(如 JPEG、PNG)并将它们转换为 NumPy 数组。这对于从内存中的数据或其他来源加载图像非常有用
cv2.imdecode(buf, flags)buf: 输入的字节流,通常是一个 bytes 对象。
flags: 解码标志,通常为 cv2.IMREAD_COLOR(默认)、cv2.IMREAD_GRAYSCALE 或 cv2.IMREAD_UNCHANGED。cv2.imencode #编码器cv2.imencode 函数用于将图像编码为指定的格式(如 JPEG、PNG)并将其存储在内存中。这对于需要将图像保存到文件之外的其他位置(例如发送到网络或数据库)非常有用。
cv2.imencode(ext, img[, params])
ext: 输出文件的扩展名,如 '.jpg', '.png' 等。
img: 输入图像,通常是一个 NumPy 数组。
params: 编码参数,对于 JPEG 格式可以指定压缩质量(0-100)。代码演示
代码演示从本地加载读取一张图像,然后通过imencode获取图像字节流数据,方便把图像通过网络传输或者保存到数据库中。imdecode支持从字节流数据转换为指定格式的图像输出,通过用于从网络接受图像数据或者从数据库的字节数据解码为图像数据。
图像编码代码演示
import numpy as np
import cv2
# 假设有一个 JPEG 图像的字节流
image_bytes = b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xc0\x00\x11\x08\x00\x01\x00\x01\x01\x00\xff\xdb\x00C\x00...'
# 使用 imdecode 解码字节流为图像
image = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow('Decoded Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()图像解码代码演示
import numpy as np
import cv2
# 读取图像
image = cv2.imread('example.jpg')
# 使用 imencode 将图像编码为 JPEG 格式
retval, buffer = cv2.imencode('.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
# 转换字节流为 bytes 对象
image_bytes = buffer.tobytes()
# 打印编码后的图像大小(以字节为单位)
print(f"Encoded image size: {len(image_bytes)} bytes")实际应用
QT5 C++客户端通过Http协议的POST方式访问图像信息到Python语言的服务端,并返回信息。其中图像提交与接受基于Base64编码。
客户端:
完整的流程是先读取图像,然后通过imencode转换为字节图像数据,再转为Base64编码信息,以JSON格式提交到WEB服务器。

服务器端
从Http的JSON数据中解析Base64数据,然后以imdecode方式解析为图像,在服务器端完成处理以后,再编码为Base64返回客户端。 解析部分代码;
base64_code = data['imdata']
print("your name is ", name)
img_data = base64.b64decode(base64_code)
image_array = np.frombuffer(img_data, np.uint8)
target_image = cv.imdecode(image_array, cv.IMREAD_COLOR)
cv.imwrite("fromqt.png", target_image)