python 图像数据相互转换

时间:2025-03-16 07:25:24
1. opencv 和 bytes
# opencv 转 二进制图片
def mat2bytes(image: np.ndarray) -> bytes:
	return np.array(cv2.imencode('.jpg', image)[1]).tobytes()
# 二进制图片 转 opencv
def bytes2mat(image: bytes) -> np.ndarray:
    return cv2.imdecode(np.array(bytearray(image), dtype='uint8'), cv2.IMREAD_UNCHANGED)
2. opencv 和 base64
# opencv 转 base64
def mat2base64(image: np.ndarry) -> str:
    return str(base64.b64encode(cv2.imencode('.jpg',image)[1]))[2:-1]
# base64 转 opencv
def base642mat(image: str) -> np.ndarry:
	return cv2.imdecode(np.fromstring(base64.b64decode(image), np.uint8), cv2.IMREAD_COLOR)
3. opencv 和 PIL
# opencv 转 PIL
def mat2image(image: np.ndarry) -> Image:
    return Image.fromarray(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
# PIL 转 opencv
def image2mat(image: Image) -> np.ndarry:
    return cv2.cvtColor(np.asarray(image),cv2.COLOR_RGB2BGR)
4. bytes 和 base64
# 二进制图片 转 base64
def bytes2base64(image: bytes) -> str:
	return base64.b64encode(image).decode() 
# base64 转 二进制图片
def base642bytes(image: str) -> bytes:
    return base64.b64decode(image)
5. opencv 和 QImage
# opencv 转 
def mat2qimage(image: np.ndarry) -> QImage:
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    y, x = image.shape[:2]
    return QImage(image.data, x, y, x * 3, QImage.Format_RGB888)
#  转 opencv
# 此处转换完成的图片是4通道(RGBA)还需转换成3通道(RGB)
# image = (image, cv2.COLOR_RGBA2RGB)
def qimage2mat(image: QImage) -> np.ndarry:
    image = image.convertToFormat(4)
    width = image.width()
    height = image.height()
    ptr = image.bits()
    ptr.setsize(image.byteCount())
    return np.array(ptr).reshape(height, width, 4)
6. opencv 和 matplotlib
# opencv 在 matplotlib 下的显示与保存
import matplotlib.pyplot as plt
import cv2

image = cv2.imread("./")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # BGR 转 RGB

# 先保存,再显示,否则会无法保存以及正常显示的问题。
plt.imshow(image)
plt.savefig('./')  # 保存
plt.show()  # 显示