Windowsフォームアプリケーションでの実画像保存方法です。
(作成日:2012/04/02)
1.プロジェクトを作る
2.参照設定を追加
3.アプリケーションのデザイン
まず実画像の取得と同じように作ってください。
次にPictureBoxのほかにButtonを1つ追加してください。
プロパティの[Text]の項目で表示する文字を変更できます。
4.プログラミング
先ほど配置したボタンをダブルクリックしてください。
すると自動的にボタンのクリックイベントが生成されます。
この箇所に画像保存の処理を記述します。
以下のコードのように入力してください
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// ビットマップを生成するため
using System.Drawing.Imaging;
// Kinectのセンサクラス
// Microsoft.Kinectを参照に追加
using Microsoft.Kinect;
// メモリ管理の最適化のため
// System.Runtime.Serializationを参照に追加
using System.Runtime.InteropServices;
namespace Formimagecapture
{
public partial class Form1 : Form
{
/// <summary>
/// Kinectのセンサクラス
/// </summary>
KinectSensor kinect;
/// <summary>
/// Kinectから取得したRGBデータ
/// (byte型配列)
/// </summary>
byte[] imageData;
/// <summary>
/// 実画像
/// (ビットマップ形式)
/// </summary>
Bitmap imageBitmap;
public Form1()
{
InitializeComponent();
// ビットマップの初期化
imageBitmap = new Bitmap(640, 480);
// kinectの初期化
kinect = KinectSensor.KinectSensors[0];
// カラー画像の取得を開始する
kinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(ColorFrameReady);
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
// kinectを起動する
kinect.Start();
}
private void button1_Click(object sender, EventArgs e)
{
// 画像の保存
imageBitmap.Save(DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second + ".bmp");
}
void ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
// kinectからカラーイメージを取得
ColorImageFrame image = e.OpenColorImageFrame();
// imageがnullだった場合処理しない
if (image != null)
{
// imageData配列の初期化
imageData = new byte[image.PixelDataLength];
// imageのピクセルデータをpixelDataへコピーする
image.CopyPixelDataTo(imageData);
// imageDataからビットマップへ変換する
imageBitmap = toBitmap(imageData, imageBitmap.Width, imageBitmap.Height);
// ピクチャーボックスへ反映
pictureBox1.Image = imageBitmap;
}
}
/// 取得データをビットマップデータに変換
/// </summary>
/// <param name="pixels">kinectで取得したbyte[]配列</param>
/// <param name="width">横サイズ</param>
/// <param name="height">縦サイズ</param>
/// <returns></returns>
public static Bitmap toBitmap(byte[] pixels, int width, int height)
{
// pixelsに何も入っていない場合nullを返す
if (pixels == null)
return null;
// ビットマップの初期化
var bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);
// システムメモリへロック
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
// メモリデータのコピー
Marshal.Copy(pixels, 0, data.Scan0, pixels.Length);
// システムメモリのロック解除
bitmap.UnlockBits(data);
return bitmap;
}
}
}
実行結果
このような感じで表示されるはずです。
撮影ボタンを押すと表示されている画像を保存できます。
保存された画像は、プロジェクトファイル内の[ bin/Debug/ ]にあります(.exeと同じ階層)。
保存場所を変えたい場合は、ファイル名を指定するときに[ ../ ]などパスを指定すればOKです。
保存された画像