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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:13:21