70 lines
2.2 KiB
C#
70 lines
2.2 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Text.RegularExpressions;
|
||
|
|
|
||
|
|
namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11.common
|
||
|
|
{
|
||
|
|
public class Frame
|
||
|
|
{
|
||
|
|
public int Width { get; set; }
|
||
|
|
public int Height { get; set; }
|
||
|
|
|
||
|
|
public Frame() // standard frame
|
||
|
|
{
|
||
|
|
this.Width = 640;
|
||
|
|
this.Height = 480;
|
||
|
|
}
|
||
|
|
|
||
|
|
public Frame(int width, int height)
|
||
|
|
{
|
||
|
|
Width = width;
|
||
|
|
Height = height;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Frame StandardFrame()
|
||
|
|
{
|
||
|
|
return new Frame();
|
||
|
|
}
|
||
|
|
|
||
|
|
public override string ToString() => $"{Width}x{Height}";
|
||
|
|
|
||
|
|
|
||
|
|
// Static method to parse string like "1920x1080"
|
||
|
|
public static Frame Parse(string resolution)
|
||
|
|
{
|
||
|
|
var match = Regex.Match(resolution, @"^\s*(\d+)\s*[xX]\s*(\d+)\s*$");
|
||
|
|
if (!match.Success)
|
||
|
|
{
|
||
|
|
throw new FormatException($"Invalid resolution format: '{resolution}'");
|
||
|
|
}
|
||
|
|
|
||
|
|
int width = int.Parse(match.Groups[1].Value);
|
||
|
|
int height = int.Parse(match.Groups[2].Value);
|
||
|
|
|
||
|
|
return new Frame(width, height);
|
||
|
|
}
|
||
|
|
|
||
|
|
///
|
||
|
|
/// Finds nearest frame based on selected dimension
|
||
|
|
/// <b> example: </b>
|
||
|
|
/// <code>
|
||
|
|
/// var input = new Frame(1500, 800);
|
||
|
|
/// //Nearest by Width
|
||
|
|
/// var nearestByWidth = input.FindNearest(allFrames, f => f.Width);
|
||
|
|
/// Console.WriteLine($"Nearest by width: {nearestByWidth}"); // → 1280x720
|
||
|
|
/// //Nearest by Height
|
||
|
|
/// var nearestByHeight = input.FindNearest(allFrames, f => f.Height);
|
||
|
|
/// Console.WriteLine($"Nearest by height: {nearestByHeight}"); // → 1280x720
|
||
|
|
/// </code>
|
||
|
|
|
||
|
|
public Frame FindNearest(IEnumerable<Frame> candidates, Func<Frame, int> dimensionSelector)
|
||
|
|
{
|
||
|
|
int target = dimensionSelector(this);
|
||
|
|
return candidates
|
||
|
|
.OrderBy(f => Math.Abs(dimensionSelector(f) - target))
|
||
|
|
.ThenBy(dimensionSelector) // tie-breaker: prefer smaller
|
||
|
|
.FirstOrDefault();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|