GreatHomeChildcare-2/SnapShotWin.cs

124 lines
3.6 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Windows.Forms;
using System.Text;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using GreatHomeChildcare.Models;
using System.IO;
namespace GreatHomeChildcare
{
public partial class SnapShotWin : Form
{
SqliteDataAccess SqliteDataAccess = new SqliteDataAccess();
Child child;
VideoCapture capture;
Mat frame;
Image image;
private Thread camera;
bool isCameraRunning = false;
private void CaptureCamera()
{
camera = new Thread(new ThreadStart(CaptureCameraCallback));
camera.Start();
}
private void CaptureCameraCallback()
{
frame = new Mat();
capture = new VideoCapture(0);
capture.Open(0);
if (capture.IsOpened())
{
while (isCameraRunning)
{
capture.Read(frame);
image = BitmapConverter.ToBitmap(frame);
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = image;
}
}
}
public SnapShotWin(int id)
{
InitializeComponent();
child = SqliteDataAccess.GetChildByID(id);
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text.Equals("Start"))
{
CaptureCamera();
button1.Text = "Stop";
isCameraRunning = true;
}
else
{
capture.Release();
button1.Text = "Start";
isCameraRunning = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
if (isCameraRunning)
{
byte[] pic_in;
Bitmap snapshot = new Bitmap(pictureBox1.Image);
try
{
using (var stream = new MemoryStream())
{
snapshot.Save(stream, ImageFormat.Png);
pic_in = stream.ToArray();
}
}
catch (Exception ex)
{
MessageBox.Show("Unable to picture. Try again.", "Great Home Childcare", MessageBoxButtons.OK, MessageBoxIcon.None);
return;
}
try
{
child.id = child.id;
}
catch (Exception ex)
{
MessageBox.Show("This child has not been created yet. Save the child first and then come back.", "Great Home Childcare", MessageBoxButtons.OK, MessageBoxIcon.None);
return;
}
child.photo = pic_in;
SqliteDataAccess.UpdateChild(child);
isCameraRunning = false;
Close();
}
else
{
MessageBox.Show("Cannot take picture if camera is not active.");
}
}
/**
* Simple method for converting a Bitmap to a byte array.
* @return byte array that can be used to call up an image.
*/
private byte[] BitmapToByte(Bitmap image)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(image, typeof(byte[]));
}
}
}