我正在努力将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 或任何你喜欢的东西。