mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 23:06:31 +00:00
reuse VirtualizingWrapPanel for display Dataset Explorer
This commit is contained in:
@@ -3,31 +3,25 @@ using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using Azaion.Annotator.DTO;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Color = System.Drawing.Color;
|
||||
using Size = System.Windows.Size;
|
||||
|
||||
namespace Azaion.Annotator;
|
||||
|
||||
public class GalleryManager : IGalleryManager
|
||||
public class GalleryManager(Config config, ILogger<GalleryManager> logger) : IGalleryManager
|
||||
{
|
||||
private readonly Config _config;
|
||||
|
||||
public int ThumbnailsCount { get; set; }
|
||||
public int ImagesCount { get; set; }
|
||||
|
||||
public GalleryManager(Config config)
|
||||
public async Task RefreshThumbnails()
|
||||
{
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public async Task RefreshThumbnails(CancellationToken cancellationToken)
|
||||
{
|
||||
var dir = new DirectoryInfo(_config.ThumbnailsDirectory);
|
||||
var dir = new DirectoryInfo(config.ThumbnailsDirectory);
|
||||
if (!dir.Exists)
|
||||
Directory.CreateDirectory(_config.ThumbnailsDirectory);
|
||||
Directory.CreateDirectory(config.ThumbnailsDirectory);
|
||||
|
||||
var prefixLen = Config.ThumbnailPrefix.Length;
|
||||
var thumbnailsDir = new DirectoryInfo(_config.ThumbnailsDirectory);
|
||||
var thumbnailsDir = new DirectoryInfo(config.ThumbnailsDirectory);
|
||||
|
||||
var thumbnails = thumbnailsDir.GetFiles()
|
||||
.Select(x => Path.GetFileNameWithoutExtension(x.Name)[..^prefixLen])
|
||||
@@ -36,7 +30,7 @@ public class GalleryManager : IGalleryManager
|
||||
.ToHashSet();
|
||||
ThumbnailsCount = thumbnails.Count;
|
||||
|
||||
var files = new DirectoryInfo(_config.ImagesDirectory).GetFiles();
|
||||
var files = new DirectoryInfo(config.ImagesDirectory).GetFiles();
|
||||
ImagesCount = files.Length;
|
||||
|
||||
foreach (var img in files)
|
||||
@@ -45,21 +39,28 @@ public class GalleryManager : IGalleryManager
|
||||
if (thumbnails.Contains(imgName))
|
||||
continue;
|
||||
|
||||
var bitmap = await GenerateThumbnail(img, cancellationToken);
|
||||
var thumbnailName = Path.Combine(thumbnailsDir.FullName, $"{imgName}{Config.ThumbnailPrefix}.jpg");
|
||||
bitmap.Save(thumbnailName, ImageFormat.Jpeg);
|
||||
try
|
||||
{
|
||||
var bitmap = await GenerateThumbnail(img);
|
||||
var thumbnailName = Path.Combine(thumbnailsDir.FullName, $"{imgName}{Config.ThumbnailPrefix}.jpg");
|
||||
bitmap.Save(thumbnailName, ImageFormat.Jpeg);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.LogError(e, $"Failed to generate thumbnail for {img.Name}");
|
||||
}
|
||||
|
||||
ThumbnailsCount++;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<Bitmap> GenerateThumbnail(FileInfo img, CancellationToken cancellationToken)
|
||||
private async Task<Bitmap> GenerateThumbnail(FileInfo img)
|
||||
{
|
||||
var width = (int)_config.ThumbnailConfig.Size.Width;
|
||||
var height = (int)_config.ThumbnailConfig.Size.Height;
|
||||
var width = (int)config.ThumbnailConfig.Size.Width;
|
||||
var height = (int)config.ThumbnailConfig.Size.Height;
|
||||
|
||||
var imgName = Path.GetFileNameWithoutExtension(img.Name);
|
||||
var labelName = Path.Combine(_config.LabelsDirectory, $"{imgName}.txt");
|
||||
var labelName = Path.Combine(config.LabelsDirectory, $"{imgName}.txt");
|
||||
|
||||
var originalImage = Image.FromFile(img.FullName);
|
||||
|
||||
@@ -71,39 +72,43 @@ public class GalleryManager : IGalleryManager
|
||||
g.InterpolationMode = InterpolationMode.Default;
|
||||
|
||||
var size = new Size(originalImage.Width, originalImage.Height);
|
||||
var labels = (await YoloLabel.ReadFromFile(labelName, cancellationToken))
|
||||
var labels = (await YoloLabel.ReadFromFile(labelName))
|
||||
.Select(x => new CanvasLabel(x, size, size))
|
||||
.ToList();
|
||||
|
||||
var thumbWhRatio = width / (float)height;
|
||||
var border = _config.ThumbnailConfig.Border;
|
||||
var border = config.ThumbnailConfig.Border;
|
||||
|
||||
var labelsMinX = labels.Any() ? labels.Min(x => x.X);
|
||||
var labelsMaxX = labels.Max(x => x.X + x.Width);
|
||||
|
||||
var labelsMinY = labels.Min(x => x.Y);
|
||||
var labelsMaxY = labels.Max(x => x.Y + x.Height);
|
||||
|
||||
var labelsHeight = labelsMaxY - labelsMinY + 2 * border;
|
||||
var labelsWidth = labelsMaxX - labelsMinX + 2 * border;
|
||||
|
||||
var frameHeight = 0.0;
|
||||
var frameWidth = 0.0;
|
||||
var frameX = 0.0;
|
||||
var frameY = 0.0;
|
||||
if (labelsWidth / labelsHeight > thumbWhRatio)
|
||||
var frameHeight = size.Height;
|
||||
var frameWidth = size.Width;
|
||||
|
||||
if (labels.Any())
|
||||
{
|
||||
frameWidth = labelsWidth;
|
||||
frameHeight = Math.Min(labelsWidth / thumbWhRatio, size.Height);
|
||||
frameX = Math.Max(0, labelsMinX - border);
|
||||
frameY = Math.Max(0, 0.5 * (labelsMinY + labelsMaxY - frameHeight) - border);
|
||||
}
|
||||
else
|
||||
{
|
||||
frameHeight = labelsHeight;
|
||||
frameWidth = Math.Min(labelsHeight * thumbWhRatio, size.Width);
|
||||
frameY = Math.Max(0, labelsMinY - border);
|
||||
frameX = Math.Max(0, 0.5 * (labelsMinX + labelsMaxX - frameWidth) - border);
|
||||
var labelsMinX = labels.Min(x => x.X);
|
||||
var labelsMaxX = labels.Max(x => x.X + x.Width);
|
||||
|
||||
var labelsMinY = labels.Min(x => x.Y);
|
||||
var labelsMaxY = labels.Max(x => x.Y + x.Height);
|
||||
|
||||
var labelsHeight = labelsMaxY - labelsMinY + 2 * border;
|
||||
var labelsWidth = labelsMaxX - labelsMinX + 2 * border;
|
||||
|
||||
if (labelsWidth / labelsHeight > thumbWhRatio)
|
||||
{
|
||||
frameWidth = labelsWidth;
|
||||
frameHeight = Math.Min(labelsWidth / thumbWhRatio, size.Height);
|
||||
frameX = Math.Max(0, labelsMinX - border);
|
||||
frameY = Math.Max(0, 0.5 * (labelsMinY + labelsMaxY - frameHeight) - border);
|
||||
}
|
||||
else
|
||||
{
|
||||
frameHeight = labelsHeight;
|
||||
frameWidth = Math.Min(labelsHeight * thumbWhRatio, size.Width);
|
||||
frameY = Math.Max(0, labelsMinY - border);
|
||||
frameX = Math.Max(0, 0.5 * (labelsMinX + labelsMaxX - frameWidth) - border);
|
||||
}
|
||||
}
|
||||
|
||||
var scale = frameHeight / height;
|
||||
@@ -111,7 +116,7 @@ public class GalleryManager : IGalleryManager
|
||||
|
||||
foreach (var label in labels)
|
||||
{
|
||||
var color = _config.AnnotationClassesDict[label.ClassNumber].Color;
|
||||
var color = config.AnnotationClassesDict[label.ClassNumber].Color;
|
||||
var brush = new SolidBrush(Color.FromArgb(color.A, color.R, color.G, color.B));
|
||||
|
||||
var rectangle = new RectangleF((float)((label.X - frameX) / scale), (float)((label.Y - frameY) / scale), (float)(label.Width / scale), (float)(label.Height / scale));
|
||||
@@ -125,5 +130,5 @@ public interface IGalleryManager
|
||||
{
|
||||
int ThumbnailsCount { get; set; }
|
||||
int ImagesCount { get; set; }
|
||||
Task RefreshThumbnails(CancellationToken cancellationToken);
|
||||
Task RefreshThumbnails();
|
||||
}
|
||||
Reference in New Issue
Block a user