Asp.Net Core使用ImageSharp压缩图片存入Blob字段仍为原图问题求助
问题定位
- 核心逻辑错误:完成图片压缩调整后,没有对内存中已经处理好的
Image对象做序列化处理,反而直接遍历读取上传的原始文件流赋值给bolb.image,导致写入数据库的始终是未压缩的原文件。 - 冗余逻辑:方法参数已经直接绑定了上传的
IFormFile file对象,不需要再遍历HttpContext.Request.Form.Files集合读取文件。 - 缺失存库逻辑:现有代码仅给
bolb对象的image属性赋值,没有将bolb对象写入数据库的相关代码(如果是你省略了这部分可以忽略这条)。
修复方案
替换Index方法中using (var img = Image.Load(file.OpenReadStream()))块内的逻辑即可,修改后完整代码如下:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Formats.Jpeg; // 引入该命名空间控制JPG压缩质量 [HttpPost] public async Task<IActionResult> Index(IFormFile file, BlobImg bolb) { if (file == null || file.Length <= 0) { // 可自行补充空文件校验提示逻辑 return View(); } using (var img = Image.Load(file.OpenReadStream())) { // 调整图片尺寸 string newSize = ResizeImage(img, 500, 500); string[] aSize = newSize.Split(','); img.Mutate(h => h.Resize(Convert.ToInt32(aSize[1]), Convert.ToInt32(aSize[0]))); // 将压缩后的图片序列化到流,再转换为字节数组 using (var stream = new MemoryStream()) { // Quality参数范围1-100,值越小压缩率越高、图片体积越小,可按需调整 await img.SaveAsJpegAsync(stream, new JpegEncoder { Quality = 75 }); bolb.image = stream.ToArray(); } // 这里补充你的数据库写入逻辑,示例参考: // _context.BlobImgs.Add(bolb); // await _context.SaveChangesAsync(); } return View(); } public string ResizeImage(Image img, int maxWidth, int maxHeight) { if (img.Width > maxWidth || img.Height > maxHeight) { double widthRatio = (double)img.Width / (double)maxWidth; double heightRatio = (double)img.Height / (double)maxHeight; double ratio = Math.Max(widthRatio, heightRatio); int newWidth = (int)(img.Width / ratio); int newHeight = (int)(img.Height / ratio); return newHeight.ToString() + "," + newWidth.ToString(); } else { return img.Height.ToString() + "," + img.Width.ToString(); } }
内容的提问来源于stack exchange,提问作者Soumik Mahajan
相关产品推荐
相关产品推荐

