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

如何将Telerik .NET Maui条形码(QR码)导出为图片?

.NET MAUI 导出QR码为可外部访问图片的实操方案

以下两种方案均适配.NET 7+ MAUI项目,解决无ToJpeg()方法时的QR码导出需求:

方案一:利用MAUI视图捕获功能(适用于已有QR码控件)

如果已经通过第三方控件生成了QR码(比如ZXing.Net.Maui),可以直接捕获控件视图并保存为图片:

步骤1:确认控件与权限

确保你的QR码控件是VisualElement子类,同时配置平台权限:

  • Android:在AndroidManifest.xml中添加存储相关权限(适配不同Android版本)
  • iOS:在Info.plist中添加NSPhotoLibraryAddUsageDescription权限描述

步骤2:代码实现

页面XAML示例:

<!-- 假设使用ZXing.Net.Maui的BarcodeView -->
<zxing:BarcodeView x:Name="QrCodeView" 
                   BarcodeFormat="QrCode" 
                   Value="你的QR码内容" 
                   WidthRequest="200" 
                   HeightRequest="200" />
<Button Text="保存QR码" Clicked="SaveQrCode_Clicked" />

后台C#代码:

using Microsoft.Maui.Storage;

private async void SaveQrCode_Clicked(object sender, EventArgs e)
{
    // 捕获QR码控件为图片对象
    var capturedImage = await QrCodeView.CaptureAsync();
    if (capturedImage == null)
    {
        await DisplayAlert("错误", "捕获QR码失败", "确定");
        return;
    }

    // 将图片转为JPEG流
    using var stream = new MemoryStream();
    await capturedImage.SaveAsync(stream, Microsoft.Maui.Graphics.ImageFormat.Jpeg);
    stream.Position = 0;

    // 保存到设备图片库(用户可在相册/文件管理器中访问)
    var fileName = $"QRCode_{DateTime.Now:yyyyMMddHHmmss}.jpg";
    await MediaPicker.Default.SavePhotoAsync(new MediaPickerSavePhotoOptions
    {
        FileName = fileName,
        Title = "保存QR码"
    }, stream);

    await DisplayAlert("成功", "QR码已保存到图片库", "确定");
}

方案二:SkiaSharp手动生成并导出(通用无依赖)

如果现有控件无法适配,可直接用SkiaSharp手动生成QR码并保存,兼容性更强:

步骤1:安装依赖包

安装SkiaSharp.Views.Maui.Controls和SkiaSharp.QrCode NuGet包

步骤2:代码实现

using SkiaSharp;
using SkiaSharp.QrCode;
using Microsoft.Maui.Storage;

private async Task SaveCustomQrCode(string qrContent)
{
    // 生成QR码数据
    var qrGenerator = new SKQrCodeGenerator();
    var qrCodeData = qrGenerator.CreateQrCode(qrContent, SKEncodedImageFormat.Png);

    // 创建画布绘制QR码(设置300x300分辨率)
    var imageInfo = new SKImageInfo(300, 300);
    using var surface = SKSurface.Create(imageInfo);
    var canvas = surface.Canvas;

    canvas.Clear(SKColors.White);
    using var blackPaint = new SKPaint { Color = SKColors.Black };

    // 逐个绘制QR码模块
    for (int y = 0; y < qrCodeData.ModuleMatrix.Height; y++)
    {
        for (int x = 0; x < qrCodeData.ModuleMatrix.Width; x++)
        {
            if (qrCodeData.ModuleMatrix.Get(x, y))
            {
                var moduleRect = new SKRect(
                    x * imageInfo.Width / qrCodeData.ModuleMatrix.Width,
                    y * imageInfo.Height / qrCodeData.ModuleMatrix.Height,
                    (x + 1) * imageInfo.Width / qrCodeData.ModuleMatrix.Width,
                    (y + 1) * imageInfo.Height / qrCodeData.ModuleMatrix.Height);
                canvas.DrawRect(moduleRect, blackPaint);
            }
        }
    }

    // 导出为JPEG流并保存到图片库
    using var finalImage = surface.Snapshot();
    using var stream = new MemoryStream();
    finalImage.Encode(SKEncodedImageFormat.Jpeg, 80).SaveTo(stream);
    stream.Position = 0;

    var fileName = $"CustomQR_{DateTime.Now:yyyyMMddHHmmss}.jpg";
    await MediaPicker.Default.SavePhotoAsync(new MediaPickerSavePhotoOptions
    {
        FileName = fileName,
        Title = "保存自定义QR码"
    }, stream);

    await DisplayAlert("成功", "QR码已保存", "确定");
}

调用时直接传入QR码内容即可:await SaveCustomQrCode("你的QR码内容");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:43:15