在.Net Core中使用QRCoder生成二维码,并用Blazor显示

发布时间 2023-09-15 17:02:53作者: 喜东东三三

首先在Negut包中下载QRCoder以及System.Drawing.Common
在下载的时候版本非常重要,跟着Git走

//在后端接口定义IQRCodeService类
using System.Drawing;
namespace WebApplication2.Service.Interfases
{
    public interface IQRCodeService
    {
        Bitmap GetQRCode(string plainText, int pixel);
    }
}


定义QRCodeService层,并且继承IQRCodeService
using QRCoder;
using System.Drawing;
using WebApplication2.Service.Interfases;

namespace WebApplication2.Service
{
    public class QRCodeService : IQRCodeService
    {
        public Bitmap GetQRCode(string plainText, int pixel)
        {
            // 生成二维码的内容
            QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();
            QRCodeData qrCodeData = qrGenerator.CreateQrCode(plainText, QRCodeGenerator.ECCLevel.Q);
            QRCode qrcode = new QRCode(qrCodeData);
            //中间小图图标
            Bitmap icon = new Bitmap(@"D:\other\R-C.jpg");
            // qrcode.GetGraphic 方法可参考最下发“补充说明” 30,代表像素
            Bitmap qrCodeImage = qrcode.GetGraphic(30, Color.Black, Color.White, icon, 15, 6, false);
            //MemoryStream ms = new MemoryStream();
            //qrCodeImage.Save(ms, ImageFormat.Jpeg);
            // 如果想保存图片 可使用 
            var LJ = DateTime.Now.ToString("yyyyMMddHHmmssfff_LJ");
            string filePath = $"D:\\other\\{LJ}.jpg";
            qrCodeImage.Save(filePath);
            return qrCodeImage;
        }

        }
    }

在控制器进行调用,并且转成流
using Microsoft.AspNetCore.Mvc;
using System.Drawing.Imaging;
using WebApplication2.Service.Interfases;

namespace WebApplication2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IQRCodeService _logger;
        public ValuesController(IQRCodeService logger)
        {
            _logger = logger;
        }


        [HttpGet]
        public IActionResult GetValues(string text) 
        {
            var qrCodeImage = _logger.GetQRCode(text,1);
            using (MemoryStream stream = new MemoryStream())
            {
                qrCodeImage.Save(stream, ImageFormat.Png);
                return File(stream.ToArray(), "image/png");
            }
        }
    }
}

至此后端接口结束,通过Swagger测试,已经可以看到二维码.

在Blazor上显示

@page "/counter"
@using System.Text.Json
@using System.Text.Json.Serialization
@using System.Text;
@inject IHttpClientFactory ClientFactory
@using QRCoder
@using System.Drawing;
@using System.Net.Http
<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>
<img src="@qrCodeImageUrl" alt="Image" style="width: 120px; height: 120px;"/>
<h6>@qrCodeImageUrl</h6>
<input id="username" @bind="currentString" />111
<button class="btn btn-primary" @onclick="OnInitializedAsync">Click me</button>

@code {
    private int currentCount = 0;
    private string currentString ="";
    private string imageSrc = "";
    private string qrCodeImageUrl;
    private Bitmap imageData;
    private void IncrementCount()
    {
        currentCount++;
    }
//使用HttpClient调用接口,并将数据转成需要的类型
    protected override async Task OnInitializedAsync()
    {
        var request = new HttpRequestMessage(HttpMethod.Get,
            $"https://localhost:44383/api/Values?text={currentString}");


        var client = ClientFactory.CreateClient();

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            byte[] qrCodeImageBytes = await response.Content.ReadAsByteArrayAsync();
            string base64Image = Convert.ToBase64String(qrCodeImageBytes);
            qrCodeImageUrl = $"data:image/png;base64,{base64Image}";
        }

      
    }
}