PIL.Image、cv2的img、bytes相互转换

PIL.Image、cv2的img、bytes相互转换


bytes转PIL.Image

from io import BytesIO
from PIL import Image

with open("test_for_classification.png", "wb") as f:
    f.write(file)
img = Image.open(BytesIO(file))
img.show()

PIL.Image转bytes

from PIL import Image
from io import BytesIO

img = Image.open('test.jpg', mode='r')
img_bytes = BytesIO()
img.save(img_bytes, format='JPEG')
img_bytes = img_bytes.getvalue()

cv2转bytes

import cv2

 _, img_encode = cv2.imencode('.jpg', img_numpy)
img_bytes = img_encode.tobytes()

bytes转cv2

import numpy as np
import cv2

img_buffer_numpy = np.frombuffer(img_bytes, dtype=np.uint8) 
img_numpy = cv2.imdecode(img_buffer_numpy, 1)  

PIL 转 cv2

img= Image.open("test.jpg")
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

cv2 转 PIL

img = cv2.imread("test.jpg")
img= Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
### 使用 `mss` 和 `cv2` 实现屏幕录制并保存为视频 为了实现将屏幕录制保存为本地视频文件的功能,可以利用 `mss` 库高效捕获屏幕图像,并通过 OpenCV (`cv2`) 将这些帧写入到视频文件中。以下是完整的解决方案: #### 安装依赖库 在开始之前,请确保安装了所需的 Python 库: ```bash pip install mss opencv-python-headless numpy ``` #### 屏幕录制代码示例 以下是一个基于 `mss` 和 `cv2` 的屏幕录制脚本[^1][^3]: ```python import cv2 import numpy as np from mss import mss from PIL import Image def record_screen(output_file="output.avi", fps=30, region=None): """ 记录屏幕并将录像保存为指定的视频文件。 参数: output_file (str): 输出视频文件名,默认为 'output.avi'。 fps (int): 录制帧率,默认为 30 帧每秒。 region (tuple): 要记录的区域坐标 (左, 上, 右, 下),默认全屏。 """ # 初始化 MSS 对象用于截取屏幕 with mss() as sct: if not region: monitor = sct.monitors[1] # 默认为主显示器 else: monitor = {"left": region[0], "top": region[1], "width": region[2] - region[0], "height": region[3] - region[1]} # 获取屏幕分辨率以设置视频编码器参数 width, height = monitor["width"], monitor["height"] # 设置视频编解码器和输出对象 fourcc = cv2.VideoWriter_fourcc(*"XVID") # 编码格式 video_writer = cv2.VideoWriter( output_file, fourcc, fps, (width, height)) try: while True: # 截图当前屏幕画面 screenshot = sct.grab(monitor) # 将截图转换为 NumPy 数组以便于 OpenCV 处理 img_np = np.array(Image.frombytes("RGB", screenshot.size, screenshot.bgra, "raw", "BGRX")) # 写入帧至视频文件 video_writer.write(cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR)) # 显示实时预览窗口(可选) cv2.imshow('Screen Recording', img_np) # 按下 ESC 键退出循环 if cv2.waitKey(1) & 0xFF == 27: # ASCII 码 27 表示 ESC 键 break finally: # 清理资源 video_writer.release() cv2.destroyAllWindows() if __name__ == "__main__": # 开始录制整个屏幕 record_screen(output_file="screen_recording.avi", fps=20) ``` #### 关键点说明 1. **MSS 性能优化**: `mss` 是一个多平台高效的屏幕抓取模块,相比其他工具如 `pyscreenshot` 或者 PyObjC 更加轻量级且快速。 2. **OpenCV 视频编写**: 利用 OpenCV 提供的 `VideoWriter` 类创建了一个 AVI 文件作为存储介质,并指定了四字符编码 `"XVID"` 来压缩数据流[^4]。 3. **自定义录制范围**: 如果只需要部分屏幕而不是整块,则可以通过调整函数调用中的 `region` 参数来限定具体位置与大小。 4. **终止条件设计**: 用户可通过键盘输入 ESC 键手动停止录制过程;此外还加入了异常处理机制保障程序结束时能够释放所有占用资源. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值