在过去的半年,LEADTOOLS一些主要版本的SDK和云服务。今天,我们要讨论的Xamarin的相机控制以及合并Web API。我们将使用Xamarin的相机控制多个图片,然后把这些图像引导的云服务。一旦这些已经上传,合并Web API将合并所有这些图像到一个文件中。
运用这两种技术有潜力无限的应用在各种行业。例如,说保险公司需要的图片损坏财产损害的证据。而不是发送20个人图片,您可以创建一个文件,包括那些20图片。
另一个用例是对任何需要数字化文档。如果你正试图让空间和清除旧的文件,你可以把你所有的图片文件,然后将它们组合到一个单一的形象。
下面是教程Xamarin的应用程序如何实现这一目标。这个例子非常适合开发人员想要访问一个移动设备的相机在短短几行代码,而不必使用本机iOS和Android代码。这也是伟大的对那些想要使用WebAPI和云服务,而无需担心服务器维护的麻烦。查看本教程,看是多么容易利用Xamarin的相机控制和LEADTOOLS云服务在一个应用程序。
上面的视频是一个快速演示应用程序的运行情况。正如你所看到的,我拍照使用Xamarin的摄像头控制,然后单击“合并”这四个文件合并在一起。这个例子的输出PDF,但可以改变的代码。
设置应用程序
第一步是获取免费30天的评估许可通过注册//m.ahtuanjie.com/downloads/nuget并创建一个帐户为您的免费试用的LEADTOOLS云服务https://services.leadtools.com/account/register。
LEADTOOLS许可证后,打开Visual Studio 2017并创建一个新项目。首先,添加Leadtools.Camera。Xamarin MainPage.xaml组装。
xmlns: leadtools = " clr-namespace: Leadtools.Camera.Xamarin;装配= Leadtools.Camera.Xamarin”
现在替换默认自动生成标签内StackLayout Xamarin的CameraView,以及一个按钮,将用于合并所有的照片和一个的图片。
< StackLayout > < leadtools: CameraView x: Name = " leadCamera " CameraOptions =“后方”HorizontalOptions =“FillAndExpand”VerticalOptions = " FillAndExpand " / > < x按钮:Name = " snapBtn " HorizontalOptions =“FillAndExpand”文本=“拍照片”点击= " SnapClicked " / > < x按钮:Name = " mergeBtn " HorizontalOptions = =点击“合并”=“FillAndExpand”文本" performMerge " / > < x按钮:Name = " downloadFileBtn " HorizontalOptions = =“FillAndExpand”文本“去文件!”Clicked="downloadFile"/>
更多的介绍使用LEADTOOLS相机控制Xamarin以及设置LEADTOOLS许可证,看看前面的帖子,最后Xamarin的相机控制。请注意,上一篇文章完成在继续之前是必要的。
现在Xamarin的相机控制和许可证已设置,添加了的代码添加图片。CameraView类有叫做PictureReceived将触发一个事件后,图像捕获调用ICamera.TakePicture ()。
调用TakePicture方法会在按钮单击事件。
空白SnapClicked(对象发送方,EventArgs args) {snapBtn。IsEnabled = false;leadCamera.Camera.TakePicture ();}
为PictureReceived创建事件处理程序,添加以下代码行后InitializeComponent ():
leadCamera。PictureReceived + = LeadCamera_PictureReceived;
的代码
首先,创建一些全局变量,并创建一个新类。
私有静态HttpClient客户;私人列表< MergeRequestObject > MergeImages = new < MergeRequestObject > ();私人字符串hostedServicesUrl = " https://azure.leadtools.com/api/ ";私有静态字符串fileUrl;
公开课MergeRequestObject{公共字符串文件标识{得到;设置;}}
正如上面提到的,和从我们的前一篇文章,MainPage.xaml。cs开始Xamarin的相机控制所需要的一切设备。最重要的是,添加代码来auto-rotate图像,使合并按钮,禁用下载按钮,InitClient方法。你应该有以下以下InitializeComponent ()。
leadCamera.CameraOptions。AutoRotateImage = true;leadCamera。PictureReceived + = LeadCamera_PictureReceived;mergeBtn。IsEnabled = false;downloadFileBtn。IsEnabled = false;InitClient ();
InitClient需要验证LEADTOOLS云服务的应用程序。
私人空间InitClient(){/ /一旦你创建的应用程序在您的帐户https://services.leadtools.com/manage与AppId / /你会收到一封电子邮件和密码字符串AppId =“在这里输入AppId”;字符串密码= "在这里输入SecretKey”;客户= new HttpClient {BaseAddress = new Uri (hostedServicesUrl)};client.DefaultRequestHeaders.Accept.Clear ();client.DefaultRequestHeaders.Accept。添加(新MediaTypeWithQualityHeaderValue (application / json));字符串authData =字符串。格式(“{0}:{1}”,AppId,密码);字符串authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));client.DefaultRequestHeaders。Authorization = new AuthenticationHeaderValue("Basic", authHeaderValue); }
代码里面PictureReceived将拯救每幅照片拍摄时间,然后把它们上传LEADTOOLS云服务。在这个例子中,将存储在一个MemoryStream PNG图像。图像保存后,它需要上传到LEADTOOLS云服务。要做到这一点,将使用一个名为UploadForMerge的方法。这种方法需要的内存流和将返回一个GUID。一旦你GUID,它将存储在一个列表,列表< MergeRequestObject > mergeImages。MergeRequestObject是我们创建的类,其中包含一个字符串称为文件标识。文件标识的GUID将从UploadForMerge回来。每个图像,将经过这个过程,有自己的GUID将添加到列表中。
私人空间LeadCamera_PictureReceived (FrameHandlerEventArgs e) {Device.BeginInvokeOnMainThread (() = > {snapBtn。文本= "图像上传LEADTOOLS云服务,请稍等”;mergeBtn。IsEnabled = false;});使用(MemoryStream = new MemoryStream女士()){使用(RasterCodecs编解码器= new RasterCodecs ()) {codecs.Save (e。形象,ms, RasterImageFormat。Png, 0);var id = UploadForMerge(女士);MergeImages。添加(新MergeRequestObject{文件标识= id.ToString ()});= > {snapBtn Device.BeginInvokeOnMainThread (()。IsEnabled = true;snapBtn。Text = "Snap Picture"; mergeBtn.Text = $"Merge {MergeImages.Count} file(s)"; DisplayAlert("Image saved!", "Image has been uploaded", "OK"); mergeBtn.IsEnabled = true; }); } } }
UploadForMerge方法就是形象正在发送到LEADTOOLS云服务,然后返回一个GUID。
公共Guid UploadForMerge (MemoryStream uploadForMergeStream) {HttpContent byteContent = new ByteArrayContent (uploadForMergeStream.ToArray ());使用(var formData = new MultipartFormDataContent ()) {formData。Add (byteContent imageStream);var url = "还是? forMerge = true”;var res =客户。PostAsync (url, formData) .Result;var guid = Guid.Empty;如果(res.IsSuccessStatusCode) {var id = res.Content.ReadAsStringAsync () .Result;返回Guid.Parse (id);}其他返回Guid.Empty;}}
一旦所有的已经采取了照片并上传到LEADTOOLS云服务,是时候将它们合并到一个文件中。为此,创建一个名为PerformMerge的新方法。
空白performMerge(对象发送方,EventArgs args) {Device.BeginInvokeOnMainThread (() = > {mergeBtn。文本=“合并文件,请稍等”;snapBtn。IsEnabled = false;mergeBtn。IsEnabled = false;});var id = PostMerge ();如果(id = = Guid.Empty) Device.BeginInvokeOnMainThread (() = > {DisplayAlert(“错误”、“GUID是空的”、“好的”);});var =结果查询(id.ToString ()); // Parse results and add the URL to the fileUrl button JArray array = JArray.Parse(results); foreach (var requestReturn in array) { var UrlArray = JArray.Parse(requestReturn.SelectToken("urls").ToString()); foreach (var uri in UrlArray) { Device.BeginInvokeOnMainThread(() => { fileUrl = uri.ToString(); }); } } // Clear list to create a new single file MergeImages.Clear(); Device.BeginInvokeOnMainThread(() => { downloadFileBtn.IsEnabled = true; mergeBtn.Text = "File(s) have been merged"; snapBtn.IsEnabled = true; }); }
内部PerformMerge另一种方法称为PostMerge方法也会返回一个GUID。
公共Guid PostMerge () {var stringContent = new stringContent (JsonConvert.SerializeObject (MergeImages)编码。use UTF8, application / json);/ /格式4将合并后的文件保存到一个PDF var url = $“格式转换/合并? = 4”;var res =客户。PostAsync (url, stringContent) .Result;如果(res.IsSuccessStatusCode) {var id = res.Content.ReadAsStringAsync () .Result;返回Guid.Parse (id);}其他返回Guid.Empty;}
继续PerformMerge方法,这就是从使用ID返回的结果将从PostMerge然后返回查询使用新方法叫做查询它接受一个字符串,并返回结果。
私人查询字符串(字符串id){字符串queryUrl = $”查询? id = {id.ToString ()}”;int状态= 100;字符串的结果= " ";JObject returnedData =零;而(状态= = 100 | |状态= = 123){Task.Delay (500) .Wait ();var =客户结果。.Result PostAsync (queryUrl零);.Result var returnedContent = result.Content.ReadAsStringAsync ();returnedData = JObject.Parse (returnedContent);状态= (int) returnedData.SelectToken (“FileStatus”); } if (status == 200) results = returnedData.SelectToken("RequestData").ToString(); return results; }
添加downloadFile方法下载该文件。
空白downloadFile(对象发送方,EventArgs args){设备。OpenUri(新Uri (fileUrl));}
结论
这两种技术为开发人员提供一个,一个高级API来访问一个移动设备摄像头,和两个,一个程序员友好的Web API。结合这些使开发人员能够创建了移动服务应用程序。
创建一个账户,让你的前50页免费!
https://services.leadtools.com/account/register
支持
准备和运行这个示例需要帮助吗?联系我们的支持团队免费的技术支持!定价或许可的问题,你可以联系我们的销售团队(sales@leadtools.com)或打电话给我们在704-332-5532。
