WinRT的QrCode开源库

时间:2012-12-12 13:43:48

标签: windows-runtime qr-code

我需要为我的Windows 8商店应用生成Qr代码。是否有任何基于Win Rt的开源Qr代码库。

3 个答案:

答案 0 :(得分:4)

我已经使用了codeplex上提供的 zxing 库。

我写的方法如下:

我正在使用DecodeQRcode来自相机CaptureFileAsync方法的存储文件,该方法会返回qrImgage的存储文件。

public async void DecodeQRCode(StorageFile file)
{
        // load a jpeg, be sure to have the Pictures Library capability in your manifest

        var data = await FileIO.ReadBufferAsync(file);

        // create a stream from the file
        var ms = new InMemoryRandomAccessStream();
        var dw = new Windows.Storage.Streams.DataWriter(ms);
        dw.WriteBuffer(data);
        await dw.StoreAsync();
        ms.Seek(0);

        // find out how big the image is, don't need this if you already know
        var bm = new BitmapImage();
        await bm.SetSourceAsync(ms);

        // create a writable bitmap of the right size
        var wb = new WriteableBitmap(bm.PixelWidth, bm.PixelHeight);
        ms.Seek(0);

        // load the writable bitpamp from the stream
        await wb.SetSourceAsync(ms);

        var lsource = new BitmapLuminanceSource(wb);

        var binarizer = new HybridBinarizer(lsource);
        var bbmp = new BinaryBitmap(binarizer);

        var c = new QRCodeReader();
       Result res= c.decode(bbmp);
    }

在拍摄QR码图像时,您必须确保正确裁剪图像,否则您将无法获得预期效果。

答案 1 :(得分:2)

我没有用过这个,但是ZXing.Net是......

  

支持解码和生成条形码(如QR)的库   代码,PDF 417,EAN,UPC,Aztec,Data Matrix,Codabar)图像内。

并且有可用于WindowsRT(以及手机)的组件

答案 2 :(得分:2)

您可以使用ZXing.NET:https://zxingnet.codeplex.com/

用于获取QR码结果的加载图像代码:

        FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.ViewMode = PickerViewMode.Thumbnail;
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.FileTypeFilter.Add(".png");
        openPicker.FileTypeFilter.Add(".jpg");
        openPicker.FileTypeFilter.Add(".bmp");

        StorageFile file = await openPicker.PickSingleFileAsync();
        if (null != file)
        {
            try
            {
                BitmapImage bitmap = new BitmapImage();
                using (IRandomAccessStream fileStream1 = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
                {
                    bitmap.SetSource(fileStream1);
                }
                using (IRandomAccessStream fileStream2 = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
                {
                    WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
                    writeableBitmap.SetSource(fileStream2); IBarcodeReader reader = new BarcodeReader();
                    var result = reader.Decode(writeableBitmap);
                    txt1.Text = result.ToString();
                }

            }
            catch (Exception exception)
            {
                //
            }
        }

从相机获取QR的代码(使用MSDN演示:http://code.msdn.microsoft.com/windowsapps/CameraCaptureUI-Sample-845a53ac并自定义):

    private async void CapturePhoto_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            rootPage.NotifyUser("", NotifyType.StatusMessage);

            // Using Windows.Media.Capture.CameraCaptureUI API to capture a photo
            CameraCaptureUI dialog = new CameraCaptureUI();
            Size aspectRatio = new Size(1, 1);
            dialog.PhotoSettings.CroppedAspectRatio = aspectRatio;

            StorageFile file = await dialog.CaptureFileAsync(CameraCaptureUIMode.Photo);
            if (file != null)
            {
                BitmapImage bitmapImage = new BitmapImage();

                using (IRandomAccessStream fileStream1 = await file.OpenAsync(FileAccessMode.Read))
                {
                    bitmapImage.SetSource(fileStream1);
                }
                CapturedPhoto.Source = bitmapImage;
                ResetButton.Visibility = Visibility.Visible;

                ZXing.BarcodeReader br = new ZXing.BarcodeReader();
                WriteableBitmap wrb = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
                BitmapImage img = new BitmapImage();
                img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                using (IRandomAccessStream fileStream2 = await file.OpenAsync(FileAccessMode.Read))
                {
                    wrb.SetSource(fileStream2);
                }
                var res = br.Decode(wrb);
                rootPage.NotifyUser(res.ToString(), NotifyType.ErrorMessage);

            }
            else
            {
                rootPage.NotifyUser("No photo captured.", NotifyType.StatusMessage);
            }
        }
        catch (Exception ex)
        {
            rootPage.NotifyUser(ex.Message, NotifyType.ErrorMessage);
        }
    }