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

