【问题标题】:ZXing QR Code Generation in Xamarin Forms PCLXamarin Forms PCL 中的 ZXing QR 码生成
【发布时间】:2016-08-31 12:38:49
【问题描述】:

我正在尝试使用 ZXing 包生成和显示二维码,我尝试了以下代码但无法显示二维码。它显示空白图像(透明)。

private void OnGenerateQRCodeButton_Clicked(object sender, EventArgs e)
    {

        var writer = new BarcodeWriter
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new EncodingOptions
            {
                Height = (int)imageCompanyLogo.Height,
                Width = (int) imageCompanyLogo.Width,
                Margin = 0,
                PureBarcode = true
            }
        };
        var bitmap = writer.Write("www.helloworld.com");
        imageQRCode.Source = ImageSource.FromStream(() => new MemoryStream(bitmap));
    }

请提出任何方法。谢谢。

【问题讨论】:

标签: xamarin xamarin.android xamarin.forms qr-code zxing


【解决方案1】:
  1. 在 PCL(Xamarin) 项目中为依赖服务创建接口。
  2. 在 Native(Xamarin.Droid) 中创建一个类并从 PCL 接口继承。
  3. 实现如下所示的方法。

    public Stream ConvertImageStream(string text, int width = 300, int height = 300)
    {
        var barcodeWriter = new ZXing.Mobile.BarcodeWriter
        {
            Format = ZXing.BarcodeFormat.QR_CODE,
            Options = new ZXing.Common.EncodingOptions
            {
                Width = width,
                Height = height,
                Margin = 10
            }
        };
    
        barcodeWriter.Renderer = new ZXing.Mobile.BitmapRenderer();
        var bitmap = barcodeWriter.Write(text);
        var stream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);  // this is the diff between iOS and Android
        stream.Position = 0;
        return stream;
    }
    
  4. 使用依赖服务从 PCL(Xamarin) 项目中调用方法。
  5. 在 xaml.cs 中

    private void OnGenerateQRCodeButton_Clicked(object sender, EventArgs e)
    {
        string barcodeText = "www.helloworld.com";
        var stream = DependencyService.Get<IBarCodeServices>().ConvertImageStream(barcodeText, (int)imageCompanyLogo.Width,(int) imageCompanyLogo.Height);
        barcodeImage.Source = ImageSource.FromStream(() => stream);
    }
    

【讨论】:

    【解决方案2】:

    调试并查看流是否为空。

    var stream = (Stream)null;
    private void OnGenerateQRCodeButton_Clicked(object sender, EventArgs e)
    {
    
        var writer = new BarcodeWriter
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new EncodingOptions
            {
                Height = (int)imageCompanyLogo.Height,
                Width = (int) imageCompanyLogo.Width,
                Margin = 0,
                PureBarcode = true
            }
        };
    
        using(var bitmap = barcodeWriter.Write("www.helloworld.com"))
        {
    
            stream = new MemoryStream();
            bitmap.Save(stream, ImageFormat.Png);
            stream.Seek(0, SeekOrigin.Begin);
        }
    
        imageQRCode.Source = ImageSource.FromStream(() => new MemoryStream(stream));
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多