刚刚做过这类开发,所以就先献丑了,当然所贴上的源码都是经过验证过的,已经运行成功了,希望可以给大家一些借鉴:
下面是metro UI代码:
<Page x:Class="Camera.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Camera" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Button x:Name="btnCamera" Content="打开摄像头" HorizontalAlignment="Left" Margin="48,259,0,0" VerticalAlignment="Top" Click="btnCamera_Click" Height="45"/> <Image x:Name="img1" HorizontalAlignment="Left" Height="609" Margin="240,78,0,0" VerticalAlignment="Top" Width="718" Stretch="Fill"/> <Button x:Name="btnSave" Content="保存图片" HorizontalAlignment="Left" Margin="48,369,0,0" VerticalAlignment="Top" Height="44" Click="btnSave_Click"/> </Grid> </Page>
显示的界面其实很简单,但是这不重要,功能才是主要的,下面贴上主要的开发代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; using Windows.Media.Capture; using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI.Xaml.Media.Imaging; using Windows.Storage.Streams; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 /* * * 作者:李天鹏 * 功能:调用PC上自带的camera实现拍照的功能,并保存在相应的文件夹下 * */ namespace Camera { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class MainPage : Page { private StorageFile file = null; public MainPage() { this.InitializeComponent(); } private async void btnCamera_Click(object sender, RoutedEventArgs e) { CameraCaptureUI dialog = new CameraCaptureUI(); dialog.PhotoSettings.CroppedAspectRatio = new Size(16, 9); file = await dialog.CaptureFileAsync(CameraCaptureUIMode.Photo); if (file != null) { BitmapImage bitmapImage = new BitmapImage(); using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read)) { bitmapImage.SetSource(fileStream); } img1.Source = bitmapImage; } } private async void btnSave_Click(object sender, RoutedEventArgs e) { if (img1.Source == null) return; else { FileSavePicker picker = new FileSavePicker(); picker.CommitButtonText = "保存"; picker.SuggestedFileName = "hello"; picker.FileTypeChoices.Add("图片",new string[]{".jpg",".jpeg",".bmp",".png"}); picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; StorageFile filePath = await picker.PickSaveFileAsync(); if (filePath != null) { //打开通过摄像头拍摄的照片,并返回流,以流的形式读取文件 var streamRandom = await file.OpenAsync(FileAccessMode.Read); //将拍摄的照片以流的形式读取到缓冲区 IBuffer buffer = RandomAccessStreamToBuffer(streamRandom); //将缓冲区内容写入相应的文件夹中 await FileIO.WriteBufferAsync(filePath, buffer); } } } //将图片写入到缓冲区 private IBuffer RandomAccessStreamToBuffer(IRandomAccessStream randomstream) { Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(randomstream.GetInputStreamAt(0)); MemoryStream memoryStream = new MemoryStream(); if (stream != null) { byte[] bytes = ConvertStreamTobyte(stream); //将流转化为字节型数组 if (bytes != null) { var binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write(bytes); } } IBuffer buffer = WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream, 0, (int)memoryStream.Length); return buffer; } //将流转换成二进制 public static byte[] ConvertStreamTobyte(Stream input) { byte[] buffer = new byte[16 * 1024]; using (MemoryStream ms = new MemoryStream()) { int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, read); } return ms.ToArray(); } } } }
但是这还不够,如果需要调用camera,还需要一些权限,应该在Package.appxmanifest里面修改权限,
修改如下:只要勾上webcam就行了。