在.Net Core中使用QRCoder生成二维码,并用Blazor显示
首先在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}";
}
}
}