如何将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
相关产品推荐
相关产品推荐

