.NET MAUI相机应用:保存前用Microsoft.Maui.Graphics压缩图片
.NET MAUI相机应用图片压缩集成步骤
前提准备
确保项目已安装Microsoft.Maui.Graphics和Microsoft.Maui.Graphics.Skia包(Skia是跨平台图形渲染后端,适配所有MAUI支持的平台)。同时在MauiProgram.cs中注册图形服务:
builder.Services.AddSingleton<IGraphicsService>(sp => new GraphicsService(sp.GetRequiredService<IServiceProvider>()));
Android平台需在MainActivity.cs的OnCreate方法中初始化Skia服务:
Microsoft.Maui.Graphics.Skia.SkiaGraphicsService.Init();
核心代码集成
在现有拍照逻辑后插入压缩步骤,完整流程如下:
// 1. 调用已实现的拍照方法获取原始图片流 using var originalPhotoStream = await CapturePhotoAsync(); // 处理不可查找的流:将原始流复制到MemoryStream(部分相机捕获的流不支持直接定位) using var tempStream = new MemoryStream(); await originalPhotoStream.CopyToAsync(tempStream); tempStream.Seek(0, SeekOrigin.Begin); // 2. 将流转为IImage using var originalImage = await GraphicsService.Instance.LoadImageAsync(tempStream); // 3. 压缩图片:按最长边限制缩放,保持宽高比 // 示例:限制最长边为1080px,可按需调整 var compressedImage = originalImage.Downsize(maxWidth: 1080, maxHeight: 1080); // 4. 将压缩后的IImage转为JPEG流(支持调整质量,范围0-100,值越高质量越好) using var compressedStream = new MemoryStream(); await compressedImage.SaveAsync( compressedStream, ImageFormat.Jpeg, quality: 80 // 可按需调整压缩质量 ); compressedStream.Seek(0, SeekOrigin.Begin); // 5. 调用已实现的相册保存逻辑,传入压缩后的流 await SaveToAlbumAsync(compressedStream, $"CompressedPhoto_{DateTime.Now:yyyyMMddHHmmss}.jpg");
关键细节说明
- 流处理:部分相机捕获的原始流不可重复读取,必须先复制到
MemoryStream再处理,否则加载IImage时会失败。 - 压缩参数:
Downsize方法的maxWidth和maxHeight是最长边限制,图片会按比例缩放,不会拉伸。SaveAsync的quality参数控制JPEG压缩质量,80是兼顾质量和体积的常用值。 - 平台适配:Skia后端已适配Windows、Android、iOS/Mac Catalyst,无需额外编写平台特定代码,直接复用现有相册保存逻辑即可。
内容的提问来源于stack exchange,提问作者KSD050
相关产品推荐
相关产品推荐

