如何使用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
相关产品推荐
相关产品推荐

