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

.NET Core中如何缩小图片尺寸?跨平台异常求助

解决.NET Core跨平台图片缩小的System.Drawing.Common不支持问题

你遇到的异常核心原因是System.Drawing.Common仅支持Windows平台,在Linux、macOS等非Windows环境下会抛出PlatformNotSupportedException。要实现跨平台的图片尺寸缩小,需改用跨平台的图片处理库,以下是两种可靠方案:

方案一:使用ImageSharp实现

ImageSharp是一款专为.NET设计的跨平台图片处理库,API友好且功能全面。

  1. 安装NuGet包
    在项目中执行安装命令:
Install-Package SixLabors.ImageSharp
  1. 替换原有代码
    以下是重写后的图片缩小并转换为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绑定,性能优异,适合对性能要求较高的场景。

  1. 安装NuGet包
Install-Package SkiaSharp
Install-Package SkiaSharp.NativeAssets.Linux.NoDependencies // Linux环境需额外安装
  1. 代码示例
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:15