.NET Core中如何缩小图片尺寸?跨平台异常求助
解决.NET Core跨平台图片缩小的System.Drawing.Common不支持问题
你遇到的异常核心原因是System.Drawing.Common仅支持Windows平台,在Linux、macOS等非Windows环境下会抛出PlatformNotSupportedException。要实现跨平台的图片尺寸缩小,需改用跨平台的图片处理库,以下是两种可靠方案:
方案一:使用ImageSharp实现
ImageSharp是一款专为.NET设计的跨平台图片处理库,API友好且功能全面。
- 安装NuGet包
在项目中执行安装命令:
Install-Package SixLabors.ImageSharp
- 替换原有代码
以下是重写后的图片缩小并转换为Base64的代码:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Processing; // 读取原始图片流 var stream = new MemoryStream(); await responseStream.CopyToAsync(stream); stream.Position = 0; // 加载并调整图片尺寸 using var image = Image.Load(stream); image.Mutate(x => x.Resize(new ResizeOptions { Size = new Size(310, 212), Mode = ResizeMode.Max // 保持图片比例,避免拉伸变形 })); // 将调整后的图片保存到流并转换为Base64 using var resizedStream = new MemoryStream(); image.Save(resizedStream, new JpegEncoder { Quality = 75 }); // 可调整JPEG质量 resizedStream.Position = 0; byte[] resizedBytes = resizedStream.ToArray(); string resizedBase64 = Convert.ToBase64String(resizedBytes); // 赋值到目标对象 VisaItineraryResponse.Pax.ElementAt(paxindex) .Docs.ElementAt(DocIndex).Base64String = resizedBase64;
方案二:使用SkiaSharp实现
SkiaSharp是Google Skia引擎的.NET绑定,性能优异,适合对性能要求较高的场景。
- 安装NuGet包
Install-Package SkiaSharp Install-Package SkiaSharp.NativeAssets.Linux.NoDependencies // Linux环境需额外安装
- 代码示例
using SkiaSharp; var stream = new MemoryStream(); await responseStream.CopyToAsync(stream); stream.Position = 0; // 加载原始图片并缩小 using var originalBitmap = SKBitmap.Decode(stream); using var resizedBitmap = originalBitmap.Resize(new SKImageInfo(310, 212), SKFilterQuality.High); // 保存为JPEG并转换为Base64 using var resizedStream = new MemoryStream(); using var image = SKImage.FromBitmap(resizedBitmap); using var data = image.Encode(SKEncodedImageFormat.Jpeg, 75); data.SaveTo(resizedStream); resizedStream.Position = 0; byte[] resizedBytes = resizedStream.ToArray(); string resizedBase64 = Convert.ToBase64String(resizedBytes); // 赋值到目标对象 VisaItineraryResponse.Pax.ElementAt(paxindex) .Docs.ElementAt(DocIndex).Base64String = resizedBase64;
关键修正说明
原有代码中Convert.ToString(resizedImage)是错误写法,这只会得到Bitmap对象的字符串描述,而非图片的Base64编码。必须通过将图片保存到流,再将流转换为字节数组,最后生成Base64字符串。
内容的提问来源于stack exchange,提问作者Riya Jose
相关产品推荐
相关产品推荐

