using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI;
using Windows.Media.Capture;
using Windows.Devices.Enumeration;
using System.Threading.Tasks;
using Windows.Media.MediaProperties;
using Windows.Storage.Streams;
using Windows.Storage.Pickers;
using Windows.Storage;
using Windows.Graphics.Imaging;
// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
namespace AppDemoOpenCarema
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
public static MainPage Current = null;
private MediaCapture mediaCaptureMgr = null;
public MainPage()
{
this.InitializeComponent();
Current = this;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
}
private async void tsCameraSwitch_Toggled(object sender, RoutedEventArgs e)
{
tsCameraSwitch.IsEnabled = false;
if (tsCameraSwitch.IsOn)
{
bool isCameraFound = await CheckForRecordingDeviceAsync();
if (isCameraFound)
{
ShowMessage("正在打开摄像头...", false);
mediaCaptureMgr = new MediaCapture();
await mediaCaptureMgr.InitializeAsync();
cePreviewer.Source = mediaCaptureMgr;
await mediaCaptureMgr.StartPreviewAsync();
btnTakePhoto.IsEnabled = true;
btnSavePhoto.IsEnabled = true;
ShowMessage("摄像头已打开", false);
}
else
{
ShowMessage("未找到摄像头", false);
}
}
else
{
cePreviewer.Source = null;
await mediaCaptureMgr.StopPreviewAsync();
mediaCaptureMgr.Dispose();
btnTakePhoto.IsEnabled = false;
ShowMessage("摄像头已关闭", false);
}
tsCameraSwitch.IsEnabled = true;
}
private async void btnTakePhoto_Click(object sender, RoutedEventArgs e)
{
try
{
ShowMessage("正在拍摄", false);
btnTakePhoto.IsEnabled = false;
tsCameraSwitch.IsEnabled = false;
btnSavePhoto.IsEnabled = false;
string fileExtention = string.Empty;
ImageEncodingProperties photoFormat = null;
if (rbtnPhotoTypeBmp.IsChecked == true)
{
photoFormat = ImageEncodingProperties.CreateBmp();
fileExtention = ".bmp";
}
else if (rbtnPhotoTypeJpg.IsChecked == true)
{
photoFormat = ImageEncodingProperties.CreateJpeg();
fileExtention = ".Jpeg";
}
else if (rbtnPhotoTypePng.IsChecked == true)
{
photoFormat = ImageEncodingProperties.CreatePng();
fileExtention = ".Png";
}
using (var imageStream = new InMemoryRandomAccessStream())
{
await mediaCaptureMgr.CapturePhotoToStreamAsync(photoFormat, imageStream);
var writeableBmp = new WriteableBitmap(1, 1);
writeableBmp.SetSource(imageStream);
// and create it again because otherwise the WB isn't fully initialized and decoding
// results in a IndexOutOfRange
writeableBmp = new WriteableBitmap(writeableBmp.PixelWidth, writeableBmp.PixelHeight);
imageStream.Seek(0);
writeableBmp.SetSource(imageStream);
imagePhoteViewer.Source = writeableBmp;
}
ShowMessage("已保存", false);
btnTakePhoto.IsEnabled = true;
tsCameraSwitch.IsEnabled = true;
btnSavePhoto.IsEnabled = true;
}
catch (Exception ex)
{
ShowMessage("错误" + ex.Message, false);
throw;
}
}
private async void btnSavePhoto_Click(object sender, RoutedEventArgs e)
{
FileSavePicker picker = new FileSavePicker();
picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
picker.FileTypeChoices.Add("Image", new List<string>() { ".jpg", ".jpeg", ".png", ".bmp" });
picker.SuggestedFileName = "Picture" + DateTime.Now.ToString("yyyyMMddhhmmss");
StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
var bitMap = imagePhoteViewer.Source as WriteableBitmap;
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
if (file.FileType.ToLower().Contains("bmp"))
{
encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);
}
else if (file.FileType.ToLower().Contains("png"))
{
encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
}
// Get pixels of the WriteableBitmap object
Stream pixelStream = bitMap.PixelBuffer.AsStream();
byte[] pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);
// Save the image file
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitMap.PixelWidth, (uint)bitMap.PixelHeight, 96.0, 96.0, pixels);
await encoder.FlushAsync();
ShowMessage("照片已保存至 " + file.Path, false);
}
}
}
/// <summary>
/// show a message dialog
/// </summary>
/// <param name="msg">message to show</param>
private void ShowMessage(string msg, bool isError)
{
//MessageDialog md = new MessageDialog(msg);
//await md.ShowAsync();
tbxStatus.Foreground = new SolidColorBrush(Colors.White);
if (isError)
{
tbxStatus.Foreground = new SolidColorBrush(Colors.Red);
}
tbxStatus.Text = msg;
}
/// <summary>
/// check is camera available
/// </summary>
/// <returns></returns>
private static async Task<bool> CheckForRecordingDeviceAsync()
{
var cameraFound = false;
var devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
if (devices.Count > 0)
{
cameraFound = true;
}
return cameraFound;
}
}
}