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

如何使用ImageSharp实现YCbCr转BGR24及YUV420转BGR4?

使用ImageSharp实现YUV420到BGR24的色彩空间转换

前置依赖

首先确保安装必要的NuGet包:

  • SixLabors.ImageSharp(核心库)
  • SixLabors.ImageSharp.Formats.Raw(用于处理原始像素格式)

处理字节数组形式的YUV420图像

YUV420的存储结构为:先存储完整的Y平面(像素数=宽度×高度),接着是Cb平面(像素数=宽度/2 × 高度/2),最后是Cr平面(像素数与Cb一致),总字节数为 宽度×高度×3/2。

示例代码:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// 替换为你的YUV420字节数组、图像宽高
byte[] yuv420Bytes = GetYourYuv420Bytes();
int imageWidth = 1920;
int imageHeight = 1080;

// 从字节数组加载YUV420图像
using Image<Yuv420> yuvImage = Image.LoadPixelData<Yuv420>(yuv420Bytes, imageWidth, imageHeight);

// 转换为BGR24格式
using Image<Bgr24> bgrImage = yuvImage.CloneAs<Bgr24>();

// 提取BGR24格式的字节数组(可选)
byte[] bgr24Bytes = new byte[bgrImage.Width * bgrImage.Height * 3];
bgrImage.CopyPixelDataTo(bgr24Bytes);

处理IntPtr形式的YUV420图像

通过MemoryMarshal将IntPtr转换为Span<byte>,再加载为ImageSharp图像对象:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using System.Runtime.InteropServices;

// 替换为你的IntPtr、图像宽高
IntPtr yuv420Ptr = GetYourYuv420IntPtr();
int imageWidth = 1920;
int imageHeight = 1080;
int totalYuvBytes = imageWidth * imageHeight * 3 / 2;

// 将IntPtr转换为可访问的Span<byte>
Span<byte> yuvSpan = MemoryMarshal.CreateSpanFrom(yuv420Ptr, totalYuvBytes);

// 加载YUV420图像
using Image<Yuv420> yuvImage = Image.LoadPixelData<Yuv420>(yuvSpan, imageWidth, imageHeight);

// 转换为BGR24格式
using Image<Bgr24> bgrImage = yuvImage.CloneAs<Bgr24>();

// 后续操作:提取字节数组或直接处理图像对象

关键注意事项

  • 存储顺序校验:大部分场景下YUV420是Y→Cb→Cr顺序,若转换后颜色异常(如偏蓝/偏红),需确认是否为Y→Cr→Cb顺序,此时需手动交换Cb和Cr平面的字节。
  • 尺寸要求:图像宽高必须为偶数,否则YUV420的Cb/Cr平面尺寸计算会出错,导致数据错位。
  • 内存安全:处理IntPtr时,确保指针指向的内存在操作期间未被释放,避免内存访问异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:11:11