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

.NET Maui中保存QRCoder生成的二维码图片问题求助

.NET Maui 保存QRCoder生成的PNG二维码解决方案

核心问题说明

.NET Maui 不支持 System.Drawing 和 System.Windows.Forms 这类桌面框架API,跨平台文件操作必须用Maui原生的存储能力。你已经拿到了二维码的字节数组,直接基于这个数组做跨平台保存即可,无需转成Image对象。


步骤1:存储二维码字节数组

先把生成的二维码字节数组存为类的成员变量,方便保存按钮调用:

// 类级别变量,暂存生成的二维码字节数据
private byte[] _currentQrCodeBytes;

private void OnRNGClicked(object sender, EventArgs e)
{
    Random rng = new Random();
    int sixDigRNG = rng.Next(1, 11);
    string rngString = sixDigRNG.ToString();

    QRCodeGenerator qrGenerator = new QRCodeGenerator();
    QRCodeData qrCodeData = qrGenerator.CreateQrCode(rngString, QRCodeGenerator.ECCLevel.L);
    PngByteQRCode qRCode = new PngByteQRCode(qrCodeData);

    // 把字节数组存到成员变量
    _currentQrCodeBytes = qRCode.GetGraphic(20);
    QrCodeImage.Source = ImageSource.FromStream(() => new MemoryStream(_currentQrCodeBytes));
}

步骤2:实现跨平台保存逻辑

使用Maui自带的 FileSaver(需引用 Microsoft.Maui.Storage 命名空间),它会自动调用各平台原生的保存对话框:

using Microsoft.Maui.Storage;

private async void OnSaveQrClicked(object sender, EventArgs e)
{
    if (_currentQrCodeBytes == null)
    {
        await DisplayAlert("提示", "请先生成二维码", "确定");
        return;
    }

    try
    {
        // 调用原生保存对话框,指定文件名和字节流
        var saveResult = await FileSaver.Default.SaveAsync(
            $"随机二维码_{DateTime.Now:yyyyMMddHHmmss}.png",
            new MemoryStream(_currentQrCodeBytes)
        );

        if (saveResult.IsSuccessful)
        {
            await DisplayAlert("保存成功", $"文件路径:\n{saveResult.FilePath}", "确定");
        }
        else
        {
            await DisplayAlert("保存失败", $"错误信息: {saveResult.Exception?.Message}", "确定");
        }
    }
    catch (Exception ex)
    {
        await DisplayAlert("异常", $"保存出错: {ex.Message}", "确定");
    }
}

步骤3:配置平台权限

  • Android:在 Platforms/Android/AndroidManifest.xml 中添加存储权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    

    注:Android 13+ 用READ_MEDIA_IMAGES,旧版本用WRITE_EXTERNAL_STORAGE。

  • iOS:在 Platforms/iOS/Info.plist 中添加相册访问描述:

    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要访问相册保存二维码图片</string>
    
  • Windows:无需额外配置,默认允许保存到用户可访问目录。


内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:42:49