在Windows IoT生成和识别二维码,实际上由于是UWP上实现,所以,理论上,这些生成和识别二维码的方法也可以在其它平台上运行。
关于二维码的生成有很多库可以实现,比如QRCoder,这个库可以在NuGet中搜索到和引入。
使用方法:
/// <summary> /// 生成二维码 /// </summary> /// <param name="text">二维码代表的字符串</param> /// <returns></returns> public async Task<BitmapImage> GenerateQrCode(string text) { var img = new BitmapImage(); var qrGenerator = new QRCodeGenerator(); var qrData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.M); var qrCode = new BitmapByteQRCode(qrData); var qrImage = qrCode.GetGraphic(20); using (var stream = new InMemoryRandomAccessStream()) { using (var writer = new DataWriter(stream.GetOutputStreamAt(0))) { writer.WriteBytes(qrImage); await writer.StoreAsync(); } await img.SetSourceAsync(stream); } return img; }
关于识别二维码,使用QRCoder库似乎无法实现,可以使用ZXing.uwp这个库实现,实际上,这个ZXing.uwp库可以识别和生成二维码和条形码。
使用方法:
/// <summary> /// 识别二维码 /// </summary> /// <param name="imgFile">二维码图片文件</param> /// <returns>二维码代表的图片</returns> public async Task<string> ReadQrCode(StorageFile imgFile) { WriteableBitmap img = await OpenWritableBitmapFile(imgFile); BarcodeReader reader = new BarcodeReader(); reader.Options.CharacterSet = "UTF-8"; Result result = reader.Decode(img); return result == null ? string.Empty : result.Text; } private async Task<WriteableBitmap> OpenWritableBitmapFile(StorageFile imgFile) { using (IRandomAccessStream stream = await imgFile.OpenAsync(FileAccessMode.Read)) { BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); WriteableBitmap img = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight); img.SetSource(stream); return img; } }