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

时间: 2024-10-05 18:05:14

win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置的相关文章

win8 metro 调用摄像头录制视频并将视频保存在相应的位置

上一篇文章介绍了在win8 metro 调用摄像头拍摄照片并将照片保存在相应的位置的功能,那么这一片文章主要介绍了的就是录制视频了,其实这个差不多,所用的思想也是一样的,因为图片和视频都可以转化为流文件,那么它们本质上都是一样的,但是还是有个别地方时不同的,接下来我们就介绍一下这个别地方的不同吧 下面是metro UI的代码: <Page x:Class="Camera1.MainPage" xmlns="http://schemas.microsoft.com/win

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"

Ionic系列——调用摄像头拍照和选择图库照片功能的实现

1.需求描述 最近要做一个功能就是调用摄像头拍照,然后上传照片的功能,或者直接打开图库选择照片然后上传. 2.准备 ①.添加插件$cordovaCamera cordova plugin add cordova-plugin-camera ②.在controller中添加依赖 3.代码实现 $scope.takePhoto=function(){     var options = {                                                        

win8 metro 自己写摄像头拍照项目

这个项目不是用的系统自带的CameraCaptureUI,是自己写的摄像头的调用,界面做的不好所以,不放了,但是可以实现拍照功能: 下面是using 程序命名空间: using Windows.Media.Capture; using Windows.Media.MediaProperties; using Windows.UI.Xaml.Media.Imaging; using Windows.Storage; using Windows.Storage.Pickers; using Wind

Unity 3D 调用摄像头捕获照片 录像

1,要想调用摄像头首先要打开摄像头驱动,如果用户允许则可以使用. 2,定义WebCamTexture的变量用于捕获单张照片. 3,连续捕获须启用线程. 实现代码: using UnityEngine; using System.Collections; using System.IO; using System.Runtime.Serialization; using System.Runtime .Serialization.Formatters.Binary; using System.Th

Android使用Intent调用摄像头并获取照片

使用Android的Intent调用另外一个activity的时候,采用的是多线程机制,异步方式.startActivityForResult之后被调用activity并没有马上返回结果给调用activity,Android的Acitivity对象中startActivityForResult的源代码中有相关的解释. /** * Launch an activity for which you would like a result?????? when it finished.?????? *

win8 metro 自己写摄像头录像项目

这是要求不适用CameraCaptureUI等使用系统自带的 camera  UI界面.要求我们自己写调用摄像头摄像的方法,如今我把我的程序贴下: UI界面的程序: <Page x:Class="Camera3.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2

将摄像头拍摄图像或者本地图片设置为头像的方法

一:效果图 效果描述:点击相框,将手机摄像头拍摄的图片或者本地图片设置为我们定义的头像 功能控件:UIImageView , UIAlertController , UITapGestureRecognizer , UIImagePickerController 首次运行的时候会提醒是否允许程序访问手机相册,点击ok     二:工程图 三:代码区 AppDelegate.h #import <UIKit/UIKit.h> @interface AppDelegate : UIResponde

win8 metro MediaCapture 类

最近接触的项目是有关win8 metro 中camera的项目,其中比较重要的类就是 MediaCapture类,现在介绍一下MediaCapture类,也总结一下自己的一些项目体会: 下面是MediaCapture类的一些方法调用: using System; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.Foundation.Metadata; using Windows.Media