【发布时间】:2020-06-04 15:52:04
【问题描述】:
我在将 QR 条码生成为 byte[] 或 Stream(我可以在 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;
二维码
这是另一个 nuget 库。我已成功用于 dotnet 核心应用程序,但它似乎与 Xamarin Forms(或 Mono 或其他)不兼容。它说不支持该平台。可能是因为它使用了System.Drawing.Common?
ZXing.Net.Mobile.Forms
我使用了另一个库,它在它下面使用了 ZXing.Net。我不喜欢的是我不知道是否有任何方法可以在不依赖 Xaml 或 ZXingBarcodeImageView 的情况下生成二维码。
我设法以这种方式生成 QR 码作为一种解决方法,但我遇到了另一面墙。请参阅https://github.com/Redth/ZXing.Net.Mobile/issues/908,其中我描述了我必须将ZXingBarcodeImageView 嵌入到弹出窗口内的轮播中的问题。
所以基本上我想回到根源,只是有一个我可以使用的最新版本 ZXing.Net(或替代方案,如果存在)的工作示例在 Xamarin 表单中。
我发现的大多数例子都在谈论BarcodeWriter,但现在已经没有这样的类了。有一个通用的 BarcodeWriter<TUnknownType> 和一个 BarcodeWriterGeneric 但正如我所说,我无法使用 Zxing.Net 库编译任何东西,并且通过 ZXing.Net.Mobile 生成的图像总是空的。
任何帮助或“现代”代码示例(最好有替代方案)将不胜感激
更新 1 换句话说,我希望在 Xamarin Forms 中拥有类似于我使用 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");
}
}
【问题讨论】:
-
谢谢,我会按照示例试一试。尽管它使用了我使用的相同库,但它生成了平台不支持的异常。但它看起来很有希望回购!
-
您可以在答案中分享您的解决方案并标记它,这将帮助更多有相同问题的人:)。
标签: xamarin.forms qr-code zxing.net