Windows Phone 8上的QR扫描

时间:2014-01-25 14:25:17

标签: c# windows-phone-8 qr-code barcode-scanner scanning

我一直在努力寻找一个关于如何使用Windows Phone 8进行QR码的体面教程。不幸的是,所有这些(至少是我发现的,这是一个很大的负载),都是针对WP7的并没有奏效。

其中一些需要一个PhotoLuminance对象,这在ZXing.net库中不可用。

我认为我最大的问题是我不知道如何从相机中检索ImageStream,然后每隔一秒扫描一次。

我需要一些流利的东西,而不必开始一个任务:)。

现在,我正在使用VideoBrush组件将图像捕获到矩形,因此从相机检索数据正在运行。

camera = new PhotoCamera(CameraType.Primary);
viewfinderBrush.SetSource(camera);

我使用这个作为最后的手段,我真的希望有人有一个示例代码,或者我应该如何处理这个问题

1 个答案:

答案 0 :(得分:0)

使用ZXing.Net库尝试下面给出的代码。

XAML

<Grid x:Name="grdCamera">
    <Rectangle x:Name="_previewRect" 
           Margin="0" 
           Height="800" 
           Width="600" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center">
        <Rectangle.Fill>
            <VideoBrush x:Name="_previewVideo">
                <VideoBrush.RelativeTransform>
                    <CompositeTransform  
                    x:Name="_previewTransform" CenterX=".5" CenterY=".5" />
                </VideoBrush.RelativeTransform>
            </VideoBrush>
        </Rectangle.Fill>
    </Rectangle>
</Grid>

C#

private readonly DispatcherTimer _timer;
private PhotoCameraLuminanceSource _luminance;
private QRCodeReader _reader;
private PhotoCamera _photoCamera;

//Constructor
public ScanPage()
{
    InitializeComponent();

    _timer = new DispatcherTimer();
    _timer.Interval = TimeSpan.FromMilliseconds(250);
    _timer.Tick += (o, arg) => ScanPreviewBuffer();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    _photoCamera = new PhotoCamera();
    _photoCamera.Initialized += OnPhotoCameraInitialized;
    _previewVideo.SetSource(_photoCamera);

    CameraButtons.ShutterKeyHalfPressed += (o, arg) => _photoCamera.Focus();

    base.OnNavigatedTo(e);
}

private void OnPhotoCameraInitialized(object sender, CameraOperationCompletedEventArgs e)
{
    int width = Convert.ToInt32(_photoCamera.PreviewResolution.Width);
    int height = Convert.ToInt32(_photoCamera.PreviewResolution.Height);

    _luminance = new PhotoCameraLuminanceSource(width, height);
    _reader = new QRCodeReader();

    Dispatcher.BeginInvoke(() =>
    {
        _previewTransform.Rotation = _photoCamera.Orientation;
        _timer.Start();
    });
}

private void ScanPreviewBuffer()
{
    try
    {
        _photoCamera.GetPreviewBufferY(_luminance.PreviewBufferY);
        var binarizer = new HybridBinarizer(_luminance);
        var binBitmap = new BinaryBitmap(binarizer);
        var result = _reader.decode(binBitmap);
        Dispatcher.BeginInvoke(() => MessageBox.Show(result.Text));
    }
    catch
    {
    }
}