134 lines
4.7 KiB
C#
134 lines
4.7 KiB
C#
using Basler.Pylon;
|
|
using System;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Threading;
|
|
|
|
namespace WpfApp1
|
|
{
|
|
/// <summary>
|
|
/// TimedCapture.xaml 的交互逻辑
|
|
/// </summary>
|
|
public partial class TimedCapture : Window
|
|
{
|
|
private readonly Camera _camera;
|
|
private readonly DispatcherTimer _timer = new DispatcherTimer();
|
|
private string _saveFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
|
|
private int _intervalMs = 1000;
|
|
|
|
public TimedCapture(Camera camera)
|
|
{
|
|
InitializeComponent();
|
|
_camera = camera;
|
|
|
|
var name = _camera?.CameraInfo?[CameraInfoKey.FriendlyName];
|
|
CameraInfoTextBlock.Text = string.IsNullOrWhiteSpace(name) ? "未知相机" : name;
|
|
FolderTextBox.Text = _saveFolder;
|
|
IntervalTextBox.Text = _intervalMs.ToString();
|
|
|
|
_timer.Tick += OnTimerTick;
|
|
_timer.IsEnabled = false;
|
|
}
|
|
|
|
private void BrowseButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
var selected = FolderHelper.SelectFolder("请选择保存目录");
|
|
if (!string.IsNullOrWhiteSpace(selected))
|
|
{
|
|
_saveFolder = selected;
|
|
FolderTextBox.Text = _saveFolder;
|
|
}
|
|
}
|
|
|
|
private void TimedCaptureStart_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_camera == null || !_camera.IsOpen)
|
|
{
|
|
MessageBox.Show("相机未打开");
|
|
return;
|
|
}
|
|
|
|
if (!int.TryParse(IntervalTextBox.Text, out var ms) || ms <= 0)
|
|
{
|
|
MessageBox.Show("请输入有效的拍摄间隔(毫秒)");
|
|
return;
|
|
}
|
|
_intervalMs = ms;
|
|
_timer.Interval = TimeSpan.FromMilliseconds(_intervalMs);
|
|
|
|
if (string.IsNullOrWhiteSpace(FolderTextBox.Text))
|
|
{
|
|
MessageBox.Show("请选择保存文件夹");
|
|
return;
|
|
}
|
|
_saveFolder = FolderTextBox.Text.Trim();
|
|
if (!Directory.Exists(_saveFolder))
|
|
{
|
|
try { Directory.CreateDirectory(_saveFolder); } catch (Exception ex) { MessageBox.Show("创建文件夹失败:" + ex.Message); return; }
|
|
}
|
|
|
|
StatusTextBlock.Text = "状态:拍摄中";
|
|
TimedCaptureStart.IsEnabled = false;
|
|
TimedCaptureStop.IsEnabled = true;
|
|
_timer.Start();
|
|
}
|
|
|
|
private void TimedCaptureStop_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
_timer.Stop();
|
|
StatusTextBlock.Text = "状态:已停止";
|
|
TimedCaptureStart.IsEnabled = true;
|
|
TimedCaptureStop.IsEnabled = false;
|
|
}
|
|
|
|
private void OnTimerTick(object? sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
// 单次抓拍
|
|
using (IGrabResult grabResult = _camera.StreamGrabber.GrabOne(_intervalMs))
|
|
{
|
|
if (grabResult != null && grabResult.GrabSucceeded)
|
|
{
|
|
var converter = new PixelDataConverter { OutputPixelFormat = PixelType.BGRA8packed };
|
|
byte[] buffer = new byte[grabResult.Width * grabResult.Height * 4];
|
|
converter.Convert(buffer, grabResult);
|
|
|
|
var bitmap = BitmapSource.Create(
|
|
grabResult.Width,
|
|
grabResult.Height,
|
|
96, 96,
|
|
System.Windows.Media.PixelFormats.Bgra32,
|
|
null,
|
|
buffer,
|
|
grabResult.Width * 4);
|
|
|
|
string file = Path.Combine(_saveFolder, $"Timed_{DateTime.Now:yyyyMMdd_HHmmss_fff}.png");
|
|
SaveImage(bitmap, file);
|
|
StatusTextBlock.Text = "状态:已保存 " + System.IO.Path.GetFileName(file);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
StatusTextBlock.Text = "状态:抓拍失败 - " + ex.Message;
|
|
}
|
|
}
|
|
|
|
private static void SaveImage(BitmapSource bitmap, string filePath)
|
|
{
|
|
var encoder = new PngBitmapEncoder();
|
|
encoder.Frames.Add(BitmapFrame.Create(bitmap));
|
|
using var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
|
|
encoder.Save(stream);
|
|
}
|
|
|
|
protected override void OnClosed(EventArgs e)
|
|
{
|
|
_timer.Stop();
|
|
base.OnClosed(e);
|
|
}
|
|
}
|
|
}
|