From 3f81a7c86cd9f3e57b2acab88b8e6fb8e55383cd Mon Sep 17 00:00:00 2001 From: Dan Done Date: Sun, 31 Jul 2022 12:31:39 +0100 Subject: [PATCH] #125 Added background colours to text to make them more visible --- README.md | 1 + SynoAI/Config.cs | 5 ++++ SynoAI/Services/SnapshotManager.cs | 46 +++++++++++++++++++++++++----- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6b9721d..6b2bc9c 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ An example appsettings.json configuration file can be found [here](#example-apps * Off: Will not draw boundary boxes (note - this will speed up time between detection and notification as SynoAI will not have to manipulate the image) * DrawExclusions [optional] (Default: ```false```): Whether to draw the exclusion zone boundary boxes on the image. Useful for setting up the initial exclusion zones * BoxColor [optional] (Default: ```#FF0000```): The colour of the border of the boundary box +* TextBoxColor [opional] (Default: ```#00FFFFFF``` aka ```transparent```): The colour of the box to draw behind the text to aid in making text more visible * ExclusionBoxColour [optional] (Default: ```#00FF00```): The colour of the border of the exclusion boundary box * StrokeWidth [optional] (Default: ```2```): The width, in pixels, of the border around the boundary box * Font [optional] (Default: ```Tahoma```): The font to use when labelling the boundary boxes on the output image diff --git a/SynoAI/Config.cs b/SynoAI/Config.cs index a5b49e8..9232c1f 100644 --- a/SynoAI/Config.cs +++ b/SynoAI/Config.cs @@ -55,6 +55,10 @@ public static class Config /// The hex code of the colour to use for the exclusion boxes. /// public static string ExclusionBoxColor { get; private set; } + /// + /// The hex code of the colour to use behind the text on the image outputs. + /// + public static string TextBoxColor { get; private set; } /// ///The stroke width of the Box drawn around the objects. @@ -192,6 +196,7 @@ public static void Generate(ILogger logger, IConfiguration configuration) BoxColor = configuration.GetValue("BoxColor", SKColors.Green.ToString()); FontColor = configuration.GetValue("FontColor", SKColors.Green.ToString()); ExclusionBoxColor = configuration.GetValue("ExclusionBoxColor", SKColors.Red.ToString()); + TextBoxColor = configuration.GetValue("TextBoxColor", SKColors.Transparent.ToString()); Font = configuration.GetValue("Font", "Tahoma"); FontSize = configuration.GetValue("FontSize", 12); diff --git a/SynoAI/Services/SnapshotManager.cs b/SynoAI/Services/SnapshotManager.cs index c8af550..6751fa1 100644 --- a/SynoAI/Services/SnapshotManager.cs +++ b/SynoAI/Services/SnapshotManager.cs @@ -92,20 +92,52 @@ public static ProcessedImage DressImage(Camera camera, byte[] snapshot, IEnumera // Label positioning int x = prediction.MinX + Config.TextOffsetX; - int y = prediction.MinY + Config.FontSize + Config.TextOffsetY; + int y = prediction.MinY + Config.FontSize + Config.TextOffsetY; // FontSize is added as text is drawn above the bottom co-ordinate // Consider below box placement if (Config.LabelBelowBox) { y += prediction.SizeY; } - - // Draw the text - SKFont font = new SKFont(SKTypeface.FromFamilyName(Config.Font), Config.FontSize); - canvas.DrawText(label, x, y, font, new SKPaint + + // Draw background box for the text if required + SKTypeface typeface = SKTypeface.FromFamilyName(Config.Font); + + SKPaint paint = new SKPaint { - Color = GetColour(Config.FontColor) - }); + FilterQuality = SKFilterQuality.High, + IsAntialias = true, + Color = GetColour(Config.FontColor), + TextSize = Config.FontSize, + Typeface = typeface + }; + + string textBoxColor = Config.TextBoxColor; + if (!string.IsNullOrWhiteSpace(textBoxColor) && !textBoxColor.Equals(SKColors.Transparent.ToString(), StringComparison.OrdinalIgnoreCase)) + { + float textWidth = paint.MeasureText(label); + float textBoxWidth = textWidth + (Config.TextOffsetX * 2); + float textBoxHeight = Config.FontSize + (Config.TextOffsetY * 2); + + float textBoxX = prediction.MinX + Config.StrokeWidth; + float textBoxY = prediction.MinY + Config.TextOffsetY; + if (Config.LabelBelowBox) + { + textBoxY += prediction.SizeY; + } + + SKRect textRectangle = SKRect.Create(textBoxX, textBoxY, textBoxWidth, textBoxHeight); + canvas.DrawRect(textRectangle, new SKPaint + { + Style = SKPaintStyle.StrokeAndFill, + Color = GetColour(textBoxColor), + StrokeWidth = Config.StrokeWidth + }); + } + + // Draw the text + SKFont font = new SKFont(typeface, Config.FontSize); + canvas.DrawText(label, x, y, paint); } } }