You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将Y视频原始缓冲区及YUV422_SEMI_PLANAR格式y.raw转为图像?

没问题,我来帮你搞定这两个需求——不管是单独的Y平面原始文件转成PNG/JPG,还是把Y视频缓冲区直接转成图像,用Python都能轻松实现。下面分两种情况详细说明:

一、将YUV422_SEMI_PLANAR的Y平面原始文件(y.raw)转为PNG/JPG

首先要明确:单独的Y平面数据只有亮度信息,转出来的是灰度图像。要完成转换,你需要知道两个关键参数:图像的实际宽度和高度(比如1920×1080、1280×720等),因为原始文件是无格式的二进制数据,必须按正确的尺寸还原成图像矩阵。

步骤1:安装依赖库

我们需要用numpy处理二进制数据转数组,用Pillow(PIL的分支)来保存图像。执行以下命令安装:

pip install numpy pillow

步骤2:转换代码示例

import numpy as np
from PIL import Image

# ********* 必须替换为你的图像实际尺寸 *********
width = 1920
height = 1080

# 读取Y平面原始文件的二进制数据
with open('y.raw', 'rb') as f:
    y_raw_data = f.read()

# 将二进制数据转为numpy数组,格式为uint8(单字节无符号整数,对应图像的0-255灰度值)
y_array = np.frombuffer(y_raw_data, dtype=np.uint8).reshape((height, width))

# 转换为PIL灰度图像(mode='L'表示8位灰度)
gray_image = Image.fromarray(y_array, mode='L')

# 保存为PNG或JPG
gray_image.save('output_y_gray.png')
# 如果要保存JPG,可以调整质量参数(1-95,默认75)
# gray_image.save('output_y_gray.jpg', quality=95)

注意事项

  • 如果图像显示变形,说明你填的width和height不对,要核对原始视频的分辨率。
  • 如果不确定分辨率,可以尝试常见的视频分辨率组合,或者通过文件大小反推:文件字节数 = width × height(因为每个Y像素占1字节)。
二、将Y视频原始缓冲区转换为图像

这里的“Y视频原始缓冲区”一般指内存中的Y平面数据(比如从视频流、解码后的帧缓冲区中获取的bytes数据),处理逻辑和文件读取类似,只是跳过了文件读取步骤,直接用内存中的数据即可。

代码示例(灰度图像)

import numpy as np
from PIL import Image

# ********* 替换为实际参数 *********
width = 1920
height = 1080
# 假设y_buffer是你从视频流中获取到的Y平面二进制数据(bytes类型)
y_buffer = b''  

# 将缓冲区数据转为numpy数组并重塑为图像尺寸
y_array = np.frombuffer(y_buffer, dtype=np.uint8).reshape((height, width))

# 转成图像并保存
gray_image = Image.fromarray(y_array, mode='L')
gray_image.save('video_frame_gray.png')

扩展:如果是完整的YUV422_SEMI_PLANAR帧(含U、V通道)

如果你拿到的是完整的YUV422_SEMI_PLANAR帧数据(而不是单独的Y平面),可以转换为彩色图像。这里推荐用OpenCV来处理,因为它内置了标准的YUV转RGB逻辑,更准确:

首先安装OpenCV:

pip install opencv-python

然后代码示例:

import cv2
import numpy as np

width = 1920
height = 1080
# 假设yuv_buffer是完整的YUV422_SEMI_PLANAR帧数据(总字节数=width×height×2)
yuv_buffer = b''  

# 将二进制数据转为numpy数组,YUV422_SEMI_PLANAR的shape是(height, width×2)
yuv_array = np.frombuffer(yuv_buffer, dtype=np.uint8).reshape((height, width * 2))

# 转换为BGR格式(OpenCV默认用BGR,转RGB可以再加一步转换)
bgr_image = cv2.cvtColor(yuv_array, cv2.COLOR_YUV2BGR_NV16)

# 保存彩色图像
cv2.imwrite('color_frame.png', bgr_image)

# 如果需要用PIL保存RGB格式的图像:
from PIL import Image
rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)
Image.fromarray(rgb_image).save('color_frame_rgb.png')

内容的提问来源于stack exchange,提问作者Rajesh Gopu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:47:29