【问题标题】:Generate QR code image stream or bytes for Xamarin Forms为 Xamarin Forms 生成 QR 码图像流或字节
【发布时间】: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&lt;TUnknownType&gt; 和一个 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


【解决方案1】:

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

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;
}

Here 具有此实现的工作示例

【讨论】:

    【解决方案2】:

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

    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
    

    将最后两行切换为:

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

    您将获得字节数组,但您可以在之后将其转换为 Stream 或您喜欢的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多