ASP.NET Core 6 Web API中如何用SixLabors.ImageSharp获取像素并生成图片
使用SixLabors.ImageSharp提取图片RGB像素数据(不保存文件到服务器)
核心思路
完全在内存中处理上传的图片,用SixLabors.ImageSharp加载后直接遍历提取RGB像素值,全程不将文件写入服务器磁盘,规避病毒风险。
前置准备
确保项目已安装SixLabors.ImageSharp NuGet包:
dotnet add package SixLabors.ImageSharp
实现代码
替换你原来的接口逻辑,改为提取像素数据的逻辑:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; [ApiController] [Route("[controller]")] public class ImageController : ControllerBase { [HttpPost("GetPixelData")] public async Task<IActionResult> GetPixelData([FromForm] IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("未上传有效图片文件"); } // 将上传文件读入内存流 await using var memoryStream = new MemoryStream(); await file.CopyToAsync(memoryStream); memoryStream.Position = 0; // 重置流指针到起始位置 // 以Rgba32格式加载图片(包含RGB和Alpha通道,方便提取RGB) using var image = Image.Load<Rgba32>(memoryStream); // 初始化存储像素数据的二维数组 var pixelData = new int[image.Height][]; for (int y = 0; y < image.Height; y++) { pixelData[y] = new int[image.Width]; // 高效遍历当前行的所有像素 image.ProcessPixelRows(accessor => { var rowSpan = accessor.GetRowSpan(y); for (int x = 0; x < image.Width; x++) { Rgba32 pixel = rowSpan[x]; // 将RGB值打包为整数(格式:R<<16 | G<<8 | B),也可单独存储R/G/B值 int rgbValue = (pixel.R << 16) | (pixel.G << 8) | pixel.B; pixelData[y][x] = rgbValue; } }); } // 返回包含尺寸和像素数据的结果,后续可根据此数据重新生成图片 return Ok(new { Width = image.Width, Height = image.Height, RgbPixelData = pixelData }); } }
关键说明
- 像素访问方式:使用
ProcessPixelRows是ImageSharp推荐的高效像素遍历方式,比逐个像素索引访问性能更优。 - 像素格式选择:指定
Rgba32格式可以直接获取每个像素的R、G、B、Alpha通道值,按需提取RGB即可。 - 数据存储灵活:如果不需要打包为整数,也可以用自定义类或多维数组分别存储每个像素的R、G、B数值。
- 无磁盘写入:整个流程仅在内存中处理上传文件,不会将任何文件保存到服务器磁盘,彻底规避病毒文件落地风险。
内容的提问来源于stack exchange,提问作者Ramin Azali
相关产品推荐
相关产品推荐

