using CCDCount.DLL;
using CCDCount.DLL.SqlDataClass;
using CCDCount.MODEL.ConfigModel;
using CCDCount.MODEL.ShuLiModel;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CCDCountWpf.WpfPage
{
///
/// HistoryDataPage.xaml 的交互逻辑
///
public partial class HistoryDataPage : Page
{
private static ActionMesSqliteDataClass actionMesSqliteDataClass = null;
int DataStartLine = 0;
private int PageHeight = 2000;
public HistoryDataPage()
{
InitializeComponent();
DataContext = ShowMessageBus.ShowBinding;
actionMesSqliteDataClass = new ActionMesSqliteDataClass($"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.MainThreadS[0].cameraConfig.CamerNo}\\ActiveObjectData{DateTime.Now:yyyyMMdd}.db");
actionMesSqliteDataClass.GetAllActionMinStartMaxEndLine(out int num, out int StartLine, out int EndLine);
ShowMessageBus.ShowBinding.HistoryImageCount = (EndLine - StartLine)/PageHeight;
DataStartLine = StartLine;
UpDateShowBinding();
}
private void PreviousBtn_Click(object sender, RoutedEventArgs e)
{
if (ShowMessageBus.ShowBinding.HistoryImageNum <= 1)
{
MessageBox.Show("已经是第一页");
return;
}
ShowMessageBus.ShowBinding.HistoryImageNum -= 1;
UpDateShowBinding();
}
private void NextBtn_Click(object sender, RoutedEventArgs e)
{
if (ShowMessageBus.ShowBinding.HistoryImageNum >= ShowMessageBus.ShowBinding.HistoryImageCount)
{
MessageBox.Show("已经是最后一页");
return;
}
ShowMessageBus.ShowBinding.HistoryImageNum += 1;
UpDateShowBinding();
}
private void UpDateShowBinding()
{
Stopwatch stopwatch = Stopwatch.StartNew();
BitmapImage ShowBitMap = null;
Bitmap BitmapImage = null;
List ShowResult = actionMesSqliteDataClass.GetActiveObjectForPage((ShowMessageBus.ShowBinding.HistoryImageNum - 1) * PageHeight + DataStartLine, ShowMessageBus.ShowBinding.HistoryImageNum * PageHeight + DataStartLine);
if (ShowResult.Count > 0)
{
int ThisImageStartLine = (int)ShowResult.Min(o => o.StartLine);
int ImageHeight = (int)(ShowResult.Max(o => o.LastSeenLine) - ShowResult.Min(o => o.StartLine));
BitmapImage = new Bitmap(4096, ImageHeight <= PageHeight ? PageHeight : ImageHeight);
using (Graphics g = Graphics.FromImage(BitmapImage))
{
g.Clear(System.Drawing.Color.White);
var redPen = new System.Drawing.Pen(System.Drawing.Color.Red, 1);
var bluePen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(0, 146, 255), 1);
var GreenPen = new System.Drawing.Pen(System.Drawing.Color.SeaGreen, 5);
foreach (var item in ShowResult)
{
int roix = item.MinStartCol - 5;
int roiy = (int)(item.StartLine - ThisImageStartLine) - 5;
int roiheight = (int)(item.LastSeenLine - (long)item.StartLine) + 10;
int roiwidth = item.MaxEndCol - item.MinStartCol + 10;
g.DrawRectangle(GreenPen, new System.Drawing.Rectangle(roix, roiy, roiwidth, roiheight));
Font font = new Font("Arial", 40);
g.DrawString(item.Num.ToString(), font, System.Drawing.Brushes.Black, new System.Drawing.Point(roix - 50 * item.Num.ToString().Length, roiy - 20));
foreach (var item1 in item.RowsData)
{
int yPos = (int)(item1.RowsCol - ThisImageStartLine);
g.DrawLine(item.StateCode == 0 ? bluePen : redPen, new System.Drawing.Point(item1.StartCol, yPos), new System.Drawing.Point(item1.EndCol, yPos));
}
}
}
}
else
{
BitmapImage = new Bitmap(4096, PageHeight);
using (Graphics g = Graphics.FromImage(BitmapImage))
{
g.Clear(System.Drawing.Color.White);
}
}
Application.Current.Dispatcher.InvokeAsync(() =>
{
ShowBitMap = ConvertToBitmapImage(BitmapImage);
ShowMessageBus.ShowBinding.HistoryImage = ShowBitMap;
});
stopwatch.Stop();
Console.WriteLine($"{stopwatch.ElapsedMilliseconds}ms");
}
// Bitmap 转 BitmapImage 的辅助方法
private BitmapImage ConvertToBitmapImage(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = memory;
bitmapImage.EndInit();
return bitmapImage;
}
}
private void SkipBtn_Click(object sender, RoutedEventArgs e)
{
UpDateShowBinding();
}
}
}