zoukankan      html  css  js  c++  java
  • win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

    刚刚做过这类开发,所以就先献丑了,当然所贴上的源代码都是经过验证过的,已经执行成功了,希望能够给大家一些借鉴:

    以下是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>
    

    显示的界面事实上非常easy,可是这不重要,功能才是基本的,以下贴上基本的开发代码:

    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即可了。



    源代码下载:

    http://download.csdn.net/detail/litianpeng1991/7548065

  • 相关阅读:
    hadoop集群部署入门(传智Hadoop学习)
    遇到问题了!
    MD5和TreeView的学习
    今天晚上完成了一个登录功能
    第一次来到博客园!
    单元测试--测?
    单元测试-公司实习1
    Mariadb数据库小结
    [奋斗的人生] 学习,总结,感恩,回馈
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4069015.html
Copyright © 2011-2022 走看看