這個專案用於儲存Kinect影像,每秒都儲存一張照片在使用者的圖片資料夾裏頭
如需要儲存更多張影像的使用者可以自行修正執行續休眠時間
或用其他方式去控制,為了避免硬碟故障,所以我就一秒只儲存一張XD
<Window x:Class="Kinect_Storage_Images.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Kinect Storage Images" Height="50" Width="150" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
</Window>
using System.Windows;
using Microsoft.Kinect;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System;
using System.IO;
using System.Threading;
namespace Kinect_Storage_Images
{
///
/// MainWindow.xaml 的互動邏輯
///
public partial class MainWindow : Window
{
private KinectSensor sensor = KinectSensor.KinectSensors[0];
private byte[] databyte;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
sensor.ColorStream.Enable();
sensor.ColorFrameReady += VideoFrameReady;
sensor.Start();
}
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
sensor.Stop();
}
}
private void VideoFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
bool hasData = false;
using (ColorImageFrame frame = e.OpenColorImageFrame())
{
if (frame == null)
{
}
else
{
databyte = new byte[frame.PixelDataLength];
frame.CopyPixelDataTo(databyte);
hasData = true;
}
}
if (hasData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Bgr32, null, databyte, 640 * 4);
SaveImage(ref source);
Thread.Sleep(1000);
}
}
private static String GetFileName()
{
return Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + "//" +
DateTime.Now.ToFileTime().ToString() + ".png";
}
private void SaveImage(ref BitmapSource source)
{
PngBitmapEncoder pe = new PngBitmapEncoder();
pe.Frames.Add(BitmapFrame.Create(source));
using (Stream s = new FileStream(GetFileName(), FileMode.Create))
{
pe.Save(s);
}
}
}
}
參考資料:
http://msdn.microsoft.com/zh-tw/library/system.windows.media.imaging.bitmapencoder.aspx