using System.Drawing.Drawing2D; using OpenCvSharp; using OpenCvSharp.Extensions; using VisionBuilder.UI.Common.Processing; using Size = System.Drawing.Size; namespace Hawkeye.VisionBuilder.Features.ImagesStrip { public partial class ImageStripPanel : Form, IImageSource { public ImageStripPanel() { InitializeComponent(); listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged; } private void ListView1_SelectedIndexChanged(object? sender, EventArgs e) { if (listView1.SelectedItems.Count > 0) { lblSelectedImage.Text = $"{listView1.SelectedIndices[0] + 1}/{listView1.Items.Count}"; var path = (string)listView1.SelectedItems[0].Tag; listView1.SelectedItems[0].ImageKey = path; var img = new Mat(path); var image = new Workflow.Datatypes.HawkeyeImage() { Filename = path, ImageData = img }; listView1.LargeImageList.Images.RemoveByKey(path); listView1.LargeImageList.Images.Add(path, img.Resize(new OpenCvSharp.Size(108, 108)).ToBitmap()); ImageSelected(image); } } public bool IsExecutingWorkflow { get => ckbExecuteWorkflow.Checked; set => ckbExecuteWorkflow.Checked = value; } public event Action ImageSelected = delegate { }; public void LoadImage(Mat image) { ImageList imageList = new ImageList(); imageList.ImageSize = new Size(108, 108); listView1.LargeImageList = imageList; listView1.Items.Clear(); imageList.Images.Add("image", image.ToBitmap()); var item = listView1.Items.Add("image"); item.Tag = new Workflow.Datatypes.HawkeyeImage() { Filename = "image", ImageData = image }; item.Text = ""; item.ImageKey = "image"; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(0); } public Bitmap FitImage(Image image, int targetWidth, int targetHeight) { var aspectRatio = (float)image.Width / image.Height; int width; int height; if ((float)targetWidth / targetHeight > aspectRatio) { width = (int)(targetHeight * aspectRatio); height = targetHeight; } else { width = targetWidth; height = (int)(targetWidth / aspectRatio); } Bitmap bitmap = new Bitmap(targetWidth, targetHeight); using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.DrawImage(image, new Rectangle(0, 0, width, height)); return bitmap; } } public void LoadImages(string directory) { listView1.BeginUpdate(); ImageList imageList = new ImageList(); imageList.ImageSize = new Size(108, 108); listView1.LargeImageList = imageList; listView1.Items.Clear(); var mock = new Bitmap(108, 108); using (Graphics g = Graphics.FromImage(mock)) { var brush = new HatchBrush(HatchStyle.Percent50, Color.LightGray, Color.Transparent); g.FillRectangle(brush, 0, 0, 108, 108); g.DrawString("Not loaded", new Font("Arial", 12), Brushes.Gray, new PointF(0, 0)); } var allImages = Directory.GetFiles(directory, "*.bmp") .Concat(Directory.GetFiles(directory, "*.png")) .Concat(Directory.GetFiles(directory, "*.jpg")) .Where(x => !Path.GetFileNameWithoutExtension(x).Contains("_analysis")) //.Select(x=>new {path=x,bmp = new Bitmap(x)}) .Select(x => new { path = x, bmp = mock }) .ToArray(); imageList.Images.Add("none", mock); foreach (var image in allImages) { var item = listView1.Items.Add(image.path); item.Text = ""; item.Tag = image.path; item.ImageKey = "none"; } if (listView1.Items.Count > 0) { listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(0); toolStrip1.Enabled = true; } else { toolStrip1.Enabled = false; } listView1.EndUpdate(); } private void btnToStart_Click(object sender, EventArgs e) { listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(0); listView1.EnsureVisible(listView1.SelectedIndices[0]); } public void Prev() { btnPrev_Click(null, null); } private void btnPrev_Click(object sender, EventArgs e) { if (listView1.SelectedIndices.Count == 0) return; var index = listView1.SelectedIndices[0]; index--; if (index < 0) index++; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); } public void Next() { btnNext_Click(null, null); } private void btnNext_Click(object sender, EventArgs e) { if (listView1.SelectedIndices.Count == 0) return; var index = listView1.SelectedIndices[0]; index++; if (index > listView1.Items.Count - 1) index--; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); } private void btnToEnd_Click(object sender, EventArgs e) { listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(listView1.Items.Count - 1); listView1.EnsureVisible(listView1.SelectedIndices[0]); } private void btnPlay_Click(object sender, EventArgs e) { Task.Run(Playback); } private async Task Playback() { while (btnPlay.Checked) { Action a = () => { if (listView1.SelectedIndices.Count == 0) return; var index = listView1.SelectedIndices[0]; index++; if (index > listView1.Items.Count - 1) { if (cbRepeat.Checked) { index = 0; } else { btnPlay.Checked = false; return; } } listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); }; listView1.Invoke(a); await Task.Delay(int.Parse((string)ncInterval.Text)); } } public string GetName() { return "ImageStripPanel"; } public Task GetImage(CancellationToken token) { return Task.FromResult(GetImage()); } public Mat GetImage() { if (listView1.SelectedIndices.Count == 0) return null; var path = listView1.SelectedItems[0].ImageKey; return new Mat(path); } public string GetImagePath() { if (listView1.SelectedIndices.Count == 0) return null; var path = listView1.SelectedItems[0].Tag as string; if (path == null) return null; return path; } public bool StopOnErrors { get => ckbStopOnError.Checked; set => ckbStopOnError.Checked = value; } public bool StopOnNoErrors { get => ckbStopOnNoError.Checked; set => ckbStopOnNoError.Checked = value; } public void InformImageProcessed(bool result) { if (!result) { if (ckbStopOnError.Checked) { btnPlay.Checked = false; } } else { if (ckbStopOnNoError.Checked) { btnPlay.Checked = false; } } } public void RemoveImage(Workflow.Datatypes.HawkeyeImage currentImage) { if (listView1.SelectedIndices.Count == 0) return; var index = listView1.SelectedIndices[0]; listView1.Items.RemoveAt(index); if (listView1.Items.Count > 0) { if (index > listView1.Items.Count - 1) index--; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); } } public List GetFileList() { return listView1.Items.Cast().Select(x => (string)x.Tag).ToList(); } public void ReSelect() { if(listView1.SelectedIndices.Count == 0) return; var index = listView1.SelectedIndices[0]; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); } public void SelectImage(string nextFile) { var index = listView1.Items.Cast().Where(x => (string)x.Tag == nextFile).Select(x => x.Index).FirstOrDefault(); if (index == -1) return; listView1.SelectedIndices.Clear(); listView1.SelectedIndices.Add(index); listView1.EnsureVisible(listView1.SelectedIndices[0]); } } }