Files
BaslerCapture/TimedCapture.xaml.cs
2025-11-28 14:57:00 +08:00

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);
}
}
}