代码之家  ›  专栏  ›  技术社区  ›  Matthias

通用应用位图中的ZXing

  •  0
  • Matthias  · 技术社区  · 10 年前

    我有一个旧的ZXing代码,可以很好地与 Bitmaps 但在我的Win10通用应用程序中,我正在使用 BitmapImage 如果ZXing也接受其他人,你能给我一个主意吗 位图图像 ,或者我如何达到它的工作原理?

    当我使用 using System.Drawing; 在Win10应用程序的类中,我在编译时遇到错误:

    系统未找到MarshalByRefObject

    这是我的旧工作代码:

    private string DecodeQRCodeFromBitmap(System.Drawing.Bitmap Picture)
    {
    
        dynamic luminanceSource = new ZXing.BitmapLuminanceSource(Picture);
        dynamic binarizer = new ZXing.Common.HybridBinarizer(luminanceSource);
    
    
        ZXing.BinaryBitmap bb = new ZXing.BinaryBitmap(binarizer);
        ZXing.Result br = readCode2.decode(bb);
        if (br != null) {
            Interaction.MsgBox(br.ToString);
            return Convert.ToString(br.Text);
        } else {
            return string.Empty;
        }
    }
    

    新的不工作代码:

        private string DecodeQRCodeFromBitmap(BitmapImage image)
        {
            dynamic luminanceSource = new ZXing.BitmapLuminanceSource(image);
            dynamic binarizer = new      ZXing.Common.HybridBinarizer(luminanceSource);
    
            ZXing.BinaryBitmap bb = new ZXing.BinaryBitmap(binarizer);
            ZXing.Result br = readCode.decode(bb);
            if (br != null)
            {
                return Convert.ToString(br.Text);
            }
            else {
                return string.Empty;
            }
        }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Frank Beutler    10 年前

    这是一个在windows通用应用程序中解码条形码的小示例。它在vb.net中,但您可以将其转换为c#…或在工作时问我。。。

    Imports Windows.Media.Capture
    Imports Windows.Storage.Streams
    Imports Windows.Media.MediaProperties
    
    Public NotInheritable Class MainPage
        Inherits Page
    
        Private capture As MediaCapture
    
        Private Async Function TakePhoto() As Task
            Try
                capture = New MediaCapture
                Await capture.InitializeAsync
                captureElementPreview.Source = capture
                Await capture.StartPreviewAsync
                Dim res As VideoEncodingProperties = capture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview)
                Dim iep As ImageEncodingProperties = ImageEncodingProperties.CreateBmp
                iep.Height = res.Height
                iep.Width = res.Width
                Dim barcodereader As New ZXing.BarcodeReader With {.AutoRotate = True}
                Dim wb As New WriteableBitmap(res.Width, res.Height)
                Dim result As ZXing.Result = Nothing
                While result Is Nothing
                    Using stream = New InMemoryRandomAccessStream()
                        Await capture.CapturePhotoToStreamAsync(iep, stream)
                        stream.Seek(0)
                        Await wb.SetSourceAsync(stream)
                        result = barcodereader.Decode(wb)
                    End Using
                End While
                Scanresult.Text = result.Text
                Await capture.StopPreviewAsync
                Debug.WriteLine(Scanresult.Text)
            Catch ex As Exception
                Debug.WriteLine("Exception when taking a photo: {0}", ex.ToString())
            End Try
        End Function
    
        Private Async Sub buttonCapture_Click(sender As Object, e As RoutedEventArgs)
            Await TakePhoto()
        End Sub
    
    End Class
    

    您需要导入zxing.winrt。dll从zxing库的子文件夹\winrt中删除。我从stackoverflow的另一个帖子中获取了这个代码。很多事情都可以做得更好,但它对第一步有效。。。

    问候Frank

    推荐文章