65.9K
CodeProject 正在变化。 阅读更多。
Home

终于,Xamarin 有了摄像头控件!

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019 年 4 月 1 日

CPOL
viewsIcon

24401

downloadIcon

535

无需了解原生摄像头 API,即可快速利用移动设备上的摄像头。

引言

LEADTOOLS 摄像头控件 是 LEADTOOLS SDK for Xamarin 的最新产品。它解决了 Xamarin Forms 社区对一个高级控件的迫切需求,开发者可以利用它轻松调用移动设备摄像头。使用 LEADTOOLS 摄像头控件无需了解 iOS 和 Android 的原生摄像头 API,因为 LEADTOOLS 会为您处理所有这些。LEADTOOLS 摄像头控件提供对摄像头的完全控制,包括闪光灯、对焦、分辨率等。

设置您的项目

第一步是访问 https://www.leadtools.com/downloads/nuget 注册,以获取免费的 30 天试用许可证。

创建新项目

获得 LEADTOOLS 许可证后,打开 Visual Studio 2017 并创建一个新项目。在 Visual C# 选项卡中,选择“跨平台”>“移动应用 (Xamarin Forms)”。在下一页上,选择“空白”,然后为“平台”勾选 Android 和 iOS,并为“代码共享策略”选择“共享项目”。这将为您提供 Xamarin.Forms 应用程序的起始模板。

要开始使用 Leadtools.Camera.Xamarin,您必须添加对相应 NuGet 包的引用。要修改整个解决方案的 NuGet 包,请在 Visual Studio 中右键单击解决方案,然后选择“管理解决方案的 NuGet 程序包”。

您需要安装的 NuGet 包是:

  • Leadtools.Camera.Xamarin
  • Leadtools.Barcode

设置访问设备摄像头的权限

还有一件事很重要,那就是更新权限设置以请求访问摄像头。为此,请打开位于 XamarinCameraProject.Android 项目的 Properties 文件夹中的 AndroidManifest.xml 文件,并在 manifest 元素内(而不是 application 元素内)添加以下行:

   <uses-permission android:name="android.permission.CAMERA" />
   <uses-feature android:name="android.hardware.camera" />
</manifest>

现在打开 MainActivity.cs,并用以下代码替换 OnCreate 函数:

protected override void OnCreate(Bundle savedInstanceState)
{
   TabLayoutResource = Resource.Layout.Tabbar;
   ToolbarResource = Resource.Layout.Toolbar;

   base.OnCreate(savedInstanceState);
   RequestCameraPermission();
   Xamarin.Forms.Forms.Init(this, savedInstanceState);
   LoadApplication(new App());
}

private void RequestCameraPermission()
{
   const int requestPermissionCode = 0;
   
   if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Denied &&
       ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Denied &&
       ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) !=
       Permission.Denied) return;

   ActivityCompat.RequestPermissions(this, new[]
   {
      Manifest.Permission.Camera, Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage
   }, requestPermissionCode);
}

对于 iOS,请在 XML 编辑器中打开 Info.plist 文件(Visual Studio 的默认 GUI 似乎不支持这一点),并在 dict 元素内添加以下行:

    <key>NSCameraUsageDescription</key>
    <string>This app needs access to the camera to take photos.</string>
    <key>NSPhotoLibraryUsageDescription</key>    
    <string>This app needs access to photos.</string>
</dict>

现在,在 iOS 项目中打开 AppDelegate.cs 文件,并用以下代码替换 FinishedLaunching 函数:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
   Leadtools.Camera.Xamarin.iOS.Assembly.Use();
   global::Xamarin.Forms.Forms.Init();
   LoadApplication(new App());

   return base.FinishedLaunching(app, options);
}

代码

LEADTOOLS 摄像头控件是一个 Xamarin.Forms 控件,用于显示实时摄像头预览。设置它只需要两行代码。打开 MainPage.xaml 并将以下引用添加到 Leadtools.Camera.Xamarin 程序集:

xmlns:leadtools="clr-namespace:Leadtools.Camera.Xamarin;assembly=Leadtools.Camera.Xamarin"

现在,将 StackLayout 中的默认自动生成的标签替换为 Xamarin CameraView,以及一个将用于拍照的按钮。

<StackLayout>
   <leadtools:CameraView x:Name="leadCamera" 
        CameraOptions="Rear" 
        HorizontalOptions="FillAndExpand" 
        VerticalOptions="FillAndExpand"/>
   <Button HorizontalOptions="FillAndExpand" 
       Text="Snap Picture" 
       Clicked="SnapClicked" />
</StackLayout>

接下来,打开 MainPage.xaml.cs,并在 InitializeComponent() 之前添加以下行,以设置您之前收到的 LEADTOOLS 许可证,并初始化 LEADTOOLS 摄像头控件所需的程序集。您必须设置您的许可证,否则应用程序将在运行时抛出异常。

#if __IOS__ 
   Leadtools.Converters.Assembly.Use(); 
#endif 
   Leadtools.Core.Assembly.Use(); 
   Leadtools.Svg.Assembly.Use(); 
   Leadtools.Camera.Xamarin.Assembly.Use(); 
   Leadtools.Platform.RuntimePlatform = Device.RuntimePlatform; 
   Leadtools.RasterSupport.Initialize(this);

   const string licString = "[License]\n" + "License = <doc><ver>2.0</ver>`PASTE YOUR LICENSE CONTENTS HERE`</doc>"; 
   const string developerKey = "PASTE YOUR DEVELOPER KEY HERE"; 
   var licBytes = System.Text.Encoding.UTF8.GetBytes(licString); 
   Leadtools.RasterSupport.SetLicense(licBytes, developerKey);
   InitializeComponent();
}

现在应用程序的基础已经搭建好,添加代码以读取使用摄像头控件拍摄的图像的条形码。在 CameraView 类中,有一个名为 PictureReceived 的事件,当调用 ICamera.TakePicture() 捕获图像时会触发该事件。调用 TakePicture 方法将放在按钮点击事件中。

void SnapClicked(object sender, EventArgs args)
{
	leadCamera.Camera.TakePicture();
}

要创建 PictureReceived 的事件处理程序,请在 InitializeComponent() 之后添加以下代码行:

   leadCamera.CameraOptions.AutoRotateImage = true;
   leadCamera.PictureReceived += LeadCamera_PictureReceived;

每次 PictureReceived 触发时,它都会调用 LeadCamera_PictureReceived,该函数传递 FrameHandlerEventArgsFrameHandlerEventArgs 有三个属性:

  • Data,捕获的图像数据
  • Image,与捕获操作关联的 RasterImage
  • RotationDegree,将帧旋转到纵向所需的旋转度数

在此项目中,我们使用 Image 属性获取捕获的图像,然后从中读取和提取条形码数据。让我们创建一个另一个函数,它将接收图像并读取找到的任何条形码。该函数现在应该如下所示:

private void LeadCamera_PictureReceived(FrameHandlerEventArgs e)
{
	ReadBarcode(e.Image);
}

接下来,向新的 ReadBarcodes 函数添加代码,该函数接收一个 RasterImage。LEADTOOLS 是市场上最全面的条形码工具包,可以检测和解码位图和彩色图像中的 100 多种一维和二维条形码类型。

public void ReadBarcode(RasterImage image)
{
   try
   {
      var reader = new BarcodeEngine().Reader;
      var dataArray = reader.ReadBarcodes(image, LeadRect.Empty, 0, null);
      if (dataArray == null)
      {
         Device.BeginInvokeOnMainThread(() =>
         {
            DisplayAlert("Alert", "No barcodes were found", "OK");
         });
         return;
      }
      var sb = new StringBuilder();
      sb.AppendLine($"{dataArray.Length} barcode(s) found");
      sb.AppendLine();
      foreach (var data in dataArray)
      {
         sb.AppendLine($@"
Symbology: {data.Symbology} 
Location: {data.Bounds.ToString()} 
Data: {data.Value}");
      }

      Device.BeginInvokeOnMainThread(() =>
      {
         DisplayAlert("Found Barcode(s)", sb.ToString(), "OK");
      });
   }
   catch (Exception ex)
   {
      Device.BeginInvokeOnMainThread(() =>
      {
         DisplayAlert("Alert", ex.ToString(), "OK");
      });
   }
}

就是这样!现在在您的设备上构建并运行应用程序,然后读取一些条形码!

Leadtools.Camera.Xamarin 为 Xamarin 开发者提供了一个强大的高级 API,可以访问和控制移动摄像头硬件,而无需了解与每个原生 API 相关的各种细节。

需要帮助才能开始使用此示例?通过电子邮件或聊天联系我们的支持团队,享受免费技术支持!

© . All rights reserved.