为 Xamarin 窗体生成 QR 码图像流或字节



我正在努力将QR条形码生成为byte[]或流(我可以在XAML图像源上使用的东西(

ZXING.NET

我已经尝试过 Zxing.Net 但我发现文档不是很好。 实际上,在xamarin表单类库中安装时,我能够编译,但是一旦我添加一些代码来编写条形码,我就会收到一个编译错误,指出

Can not resolve reference: `zxing`, referenced by `MyXamarinFormsClassLibrary`. Please add a NuGet package or assembly reference for `zxing`, or remove the reference to `Sasw.AforoPass`.          0   

那个图书馆正在发生一些时髦的事情。

我正在做一个简单的例子,例如:

var options = new QrCodeEncodingOptions
{
DisableECI = true,
CharacterSet = "UTF-8",
Width = 250,
Height = 250
};
var writer = new BarcodeWriter<Image>();
writer.Format = BarcodeFormat.QR_CODE;
writer.Options = options;
var result = writer.Write("foo");
MyImage.Source = result.Source;

QRCoder

这是另一个 nuget 库。我已经成功地用于dotnet核心应用程序,但它似乎与Xamarin Forms(或Mono或其他(不兼容。它说该平台不受支持。可能是因为它使用System.Drawing.Common

中兴网移动表单

我用过另一个库,它下面用 ZXing.Net。我不喜欢的是,我不知道是否有任何方法可以在不依赖 Xaml 或ZXingBarcodeImageView的情况下生成二维码。

我设法以这种方式生成QR码作为解决方法,但是我遇到了另一堵墙。请参阅 https://github.com/Redth/ZXing.Net.Mobile/issues/908,其中描述了我必须在弹出窗口内的轮播中嵌入ZXingBarcodeImageView的问题。

所以基本上我想回到根源,简单地提供一个工作示例,其中包含我可以在 Xamarin 窗体中使用的最新版本的 ZXing.Net(或替代方案,如果存在(。

我找到的大多数例子都谈到了BarcodeWriter但现在已经没有这样的类了。有一个通用的BarcodeWriter<TUnknownType>和一个BarcodeWriterGeneric但正如我所说,我无法使用Zxing.Net库编译任何东西,并且通过 ZXing.Net.Mobile 我生成的图像总是空的。

任何帮助或"现代"代码示例(最好有替代方案(将不胜感激


更新 1换句话说,我希望在 Xamarin 窗体中拥有类似于我使用 QrCoder 库的这段代码的东西。

public class QrCodeService
: IQrCodeService
{
public Stream GetQrCode(Guid id, string mimeType = "image/jpeg")
{
if (mimeType is null)
{
throw new ArgumentNullException(nameof(mimeType));
}
var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(id.ToString(), QRCodeGenerator.ECCLevel.Q);
var qrCode = new QRCode(qrCodeData);
var qrCodeImage = qrCode.GetGraphic(20);
var myImageCodecInfo = GetEncoderInfo(mimeType);
var myEncoder = Encoder.Quality;
var myEncoderParameters = new EncoderParameters(1);
var myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
var stream = new MemoryStream();
qrCodeImage.Save(stream, myImageCodecInfo, myEncoderParameters);
stream.Position = 0;
return stream;
}
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
var encoders = ImageCodecInfo.GetImageEncoders();
foreach (var encoder in encoders)
{
if (encoder.MimeType == mimeType)
{
return encoder;
}
}
throw new KeyNotFoundException($"Encoder for {mimeType} not found");
}
}

该解决方案使用 QrCoder 库,它适用于 Xamarin 窗体,如下所示。

private byte[] GetQrImageAsBytes()
{
var randomText = Guid.NewGuid().ToString();
var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(randomText, QRCodeGenerator.ECCLevel.L);
var qRCode = new PngByteQRCode(qrCodeData);
var qrCodeBytes = qRCode.GetGraphic(20);
return qrCodeBytes;
}

下面是此实现的工作示例

QrCoder 库可以做到这一点,但不要在项目的主页中使用:

QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData); // This point onwards is problematic
Bitmap qrCodeImage = qrCode.GetGraphic(20); // This will throw not supported exception

将最后 2 行切换为:

var qrCode = new PngByteQRCode(qrCodeData);
byte[] imageByteArray = qrCode.GetGraphic(20);

你会得到字节数组,但你可以把它转换成 Stream 或任何你喜欢的东西。

相关内容

  • 没有找到相关文章

最新更新