Распознавание штрих-кодов в изображении в MAUI приложении для Android

Категория: Штрих-коды.NETAndroid

8 мая 2024

В данной статье рассказывается как создать MAUI приложение для распознавания штрих-кодов в изображении в Android. Для распознавания штрих-кодов используется VintaSoft Barcode .NET SDK.

Для выполнения задачи требуется выполнить следующие шаги:
  1. Создайте пустое MAUI приложение.
    Откройте Visual Studio .NET 2022 и создайте новый проект типа .NET MAUI приложения:

    Укажите, что проект должен использовать .NET 8.0:

  2. Укажите, что MAUI приложение будет использоваться в Android.
    Откройте файл проекта и выберите целевую платформу Android.

  3. Добавьте ссылку на Vintasoft Barcode nuget-пакет в MAUI приложение.
    Добавьте ссылку на Vintasoft.Barcode nuget-пакет в MAUI приложение.

  4. Укажите, что .NET-компилятор не должен минимизировать код .NET-сборок Vintasoft и сборки Mono.Android.
    Откройте файл MAUI проекта и добавьте элементы проекта, которые позволяют указать, что .NET-компилятор не должен минимизировать .NET-сборки Vintasoft и .NET-сборку Mono.Android, если требуется минимизация .NET-сборок MAUI приложения:


    Вот элементы проекта, которые позволяют указать, что .NET-компилятор не должен минимизировать .NET-сборки Vintasoft и .NET-сборку Mono.Android, если требуется минимизация .NET-сборок MAUI приложения:
    <ItemGroup>
        <TrimmerRootAssembly Include="Vintasoft.Barcode" RootMode="library" />
        <TrimmerRootAssembly Include="Vintasoft.Shared" RootMode="library" />
        <TrimmerRootAssembly Include="Mono.Android" RootMode="library" />
    </ItemGroup>
    
  5. Добавьте Image-контрол для отображения открытого изображения, кнопку для открытия изображения из галереи изображений, кнопку для распознавания штрих-кодов в открытом изображении.
    Откройте XAML-разметку главной страницы в файле "MainPage.xaml" и добавьте Image-контрол для отображения открытого изображения, кнопку для открытия изображения из галереи изображений, кнопку для распознавания штрих-кодов в открытом изображении.


    Вот XAML-код разметки главной страницы (страница содержит Image-контрол для отображения открытого изображения, кнопку для открытия изображения из галереи изображений, кнопку для распознавания штрих-кодов в открытом изображении):
    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="MauiApp1.MainPage">
        <ScrollView>
            <VerticalStackLayout Padding="30,0" Spacing="25">
                <Image x:Name="barcodeImage" HeightRequest="500" Aspect="AspectFit"/>
                <HorizontalStackLayout>
                    <Button x:Name="openBarcodeButton" Text="Open Image..." Clicked="openBarcodeButton_Clicked" Margin="2"/>
                    <Button x:Name="recognizeBarcodeButton" Text="Recognize Barcode" Clicked="recognizeBarcodeButton_Clicked" Margin="2"/>
                </HorizontalStackLayout>
            </VerticalStackLayout>
        </ScrollView>
    </ContentPage>
    
  6. Добавьте C# код, который регистрирует оценочную версию VintaSoft Barcode .NET SDK.
    Получите C# код для регистрации оценочной версии VintaSoft Barcode .NET SDK в Android как описано в документации, и вставьте полученный код в C# код файла "MainPage.xaml.cs".


    Вот C# код, который регистрирует оценочную версию VintaSoft Barcode .NET SDK:
    // get the application name
    string applicationName = Vintasoft.Barcode.BarcodeGlobalSettings.ApplicationName;
    // if MAUI application is using in Android
    if (applicationName.StartsWith("Android"))
    {
        // register the evaluation license for VintaSoft Barcode .NET SDK
        Vintasoft.Barcode.BarcodeGlobalSettings.Register("LINUX_EVAL_USER", "LINUX_EVAL_USER_EMAIL", "LINUX_EVAL_END_DATE", "LINUX_EVAL_REG_CODE");
    }
    
  7. Добавьте C# код, который открывает изображение из галереии изображений и распознает штрих-коды в открытом изображении.
    Откройте файл "MainPage.xaml.cs" и добавьте C# код, который открывает изображение из галереии изображений, в метод openBarcodeButton_Clicked.
    Откройте файл "MainPage.xaml.cs" и добавьте C# код, который распознает штрих-коды в открытом изображении, в метод recognizeBarcodeButton_Clicked.


    Вот C# код, который открывает изображение из галереии изображений и распознает штрих-коды в открытом изображении:
    using Vintasoft.Barcode;
    
    namespace MauiApp1
    {
        public partial class MainPage : ContentPage
        {
    
            /// <summary>
            /// The current image stream.
            /// </summary>
            Stream _currentImageStream;
    
    
    
            public MainPage()
            {
                InitializeComponent();
            }
    
    
    
            private async void openBarcodeButton_Clicked(object sender, EventArgs e)
            {
                PickOptions options = new PickOptions();
                options.FileTypes = FilePickerFileType.Images;
                var result = await FilePicker.Default.PickAsync(options);
                if (result != null)
                {
                    LoadImage(File.OpenRead(result.FullPath));
                }
            }
    
            private async void recognizeBarcodeButton_Clicked(object sender, EventArgs e)
            {
                try
                {
                    recognizeBarcodeButton.IsEnabled = false;
    
                    if (_currentImageStream == null)
                        throw new Exception("Barcode image is not loaded.");
    
                    using (BarcodeReader reader = new BarcodeReader())
                    {
                        reader.Settings.ScanBarcodeTypes = BarcodeType.DataMatrix;
                        reader.Settings.BarcodeCharacteristics = BarcodeCharacteristics.NormalSizeBarcodes;
    
                        _currentImageStream.Position = 0;
                        IBarcodeInfo[] infos = reader.ReadBarcodes(_currentImageStream);
                        if (infos.Length > 0)
                        {
                            IBarcodeInfo info = infos[0];
                            await DisplayAlert("Barcode Reader", $"Recognized '{info.BarcodeType}' barcode ({reader.RecognizeTime.TotalMilliseconds} ms):\n{info.Value}", "OK");
                        }
                        else
                        {
                            throw new Exception($"No barcodes found ({reader.RecognizeTime.TotalMilliseconds} ms).");
                        }
                    }
                }
                catch (Exception ex)
                {
                    await DisplayAlert("Barcode Reader Error", ex.Message, "OK");
                }
                finally
                {
                    recognizeBarcodeButton.IsEnabled = true;
                }
            }
    
            /// <summary>
            /// Loads the image.
            /// </summary>
            /// <param name="stream">The image stream.</param>
            private async void LoadImage(Stream stream)
            {
                if (_currentImageStream != null)
                    _currentImageStream.Dispose();
    
                _currentImageStream = stream;
    
                try
                {
                    barcodeImage.Source = ImageSource.FromStream(() => CreateMemoryStream(_currentImageStream));
                }
                catch (Exception ex)
                {
                    await DisplayAlert("Load Image Error", ex.Message, "OK");
                }
            }
    
            /// <summary>
            /// Creates the memory stream from specified stream.
            /// </summary>
            /// <param name="stream">The stream.</param>
            /// <returns></returns>
            private static MemoryStream CreateMemoryStream(Stream stream)
            {
                MemoryStream result = new MemoryStream((int)stream.Length);
                CopyStream(stream, result);
                result.Position = 0;
                return result;
            }
    
            /// <summary>
            /// Copies the stream.
            /// </summary>
            /// <param name="sourceStream">The source stream.</param>
            /// <param name="destStream">The dest stream.</param>
            private static void CopyStream(Stream sourceStream, Stream destStream)
            {
                int bufferLength = 32 * 1024;
                try
                {
                    if (sourceStream.Length > 0 && sourceStream.Length < bufferLength)
                        bufferLength = (int)sourceStream.Length;
                }
                catch
                {
                }
                byte[] buffer = new byte[bufferLength];
    
                int bytesRead;
                while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    destStream.Write(buffer, 0, bytesRead);
                }
            }
    
        }
    }
    
  8. Подпишите .NET-сборку MAUI приложения, используя файл строгого имени.
    Если у вас есть файл строгого имени, подпишите .NET-сборку MAUI приложения, используя файл строгого имени.


    Если у вас нет файла строгого имени, прочтите, как создать файл строгого имени здесь.
  9. Запустите MAUI приложение в эмуляторе Android и посмотрите результат.