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

如何将SixLabors.ImageSharp的Image<Rgba32>转换为byte[]

解决ImageSharp中Image转byte[]的问题

你需要分两种场景来处理,取决于你要的是原始像素的字节数据还是编码为图片格式的字节流:

场景1:获取原始像素的byte数组(每个像素对应RGBA四个字节)

原来的代码返回Rgba32[]是因为直接对内存组调用ToArray()会把每个内存块转成Rgba32元素数组。要转成byte[],可以用MemoryMarshal.AsBytes直接将Rgba32的内存视图转为字节跨度,避免不必要的拷贝,效率更高:

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

// 你的图片对象
Image<Rgba32> myImage = new Image<Rgba32>(width, height);

// 单内存块的情况(多数单帧图片)
byte[] pixelBytes = MemoryMarshal.AsBytes(myImage.GetPixelMemory().Span).ToArray();

// 如果是多内存块(比如多帧图片或分片内存),用以下方式
byte[] pixelBytes = myImage.GetPixelMemoryGroup()
    .SelectMany(group => MemoryMarshal.AsBytes(group.Span).ToArray())
    .ToArray();

每个Rgba32结构体对应4个字节,顺序是R、G、B、A,转换后数组长度为 图片宽度 × 图片高度 × 4。

场景2:将图片编码为指定格式(PNG/JPG等)的byte数组

如果要把图片转成标准图片格式的字节流(比如用于存储或网络传输),直接用ImageSharp的编码API:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;

Image<Rgba32> myImage = new Image<Rgba32>(width, height);

using var stream = new MemoryStream();
// 编码为PNG,如需JPG可替换为JpegEncoder,还能设置编码参数(比如质量)
myImage.Save(stream, new PngEncoder());
byte[] imageBytes = stream.ToArray();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:36:10