Removed Rectangle from LocationContainer
mapped-ids-then-whole-percentages-to-location-container save-extract-faces
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using ShellProgressBar;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
using View_by_Distance.Compare.Models;
|
||||
using View_by_Distance.Distance.Models.Stateless;
|
||||
using View_by_Distance.Face.Models.Stateless;
|
||||
@ -63,21 +64,25 @@ public partial class Compare : ICompare, IDisposable
|
||||
bool runToDoCollectionFirst = GetRunToDoCollectionFirst(appSettings, compare);
|
||||
ReadOnlyCollections readOnlyCollections = GetReadOnlyCollections(appSettings);
|
||||
ReadOnlyCollection<ExifDirectory> mappedExifDirectoryWithEncoding = GetMappedExifDirectoryWithEncoding(appSettings, compare, readOnlyCollections);
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, FilePath>> keyValuePairs = IDistance.Extract(appSettings.CompareSettings, mappedExifDirectoryWithEncoding);
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer = IDistance.Extract(appSettings.DistanceSettings, appSettings.CompareSettings, compare, mappedExifDirectoryWithEncoding);
|
||||
if (appSettings.CompareSettings.SaveExtractFaces)
|
||||
SaveExtractFaces(appSettings, mappedIdsThenWholePercentagesToLocationContainer);
|
||||
foreach (string outputResolution in appSettings.CompareSettings.OutputResolutions)
|
||||
{
|
||||
if (runToDoCollectionFirst || outputResolution.Any(char.IsNumber))
|
||||
continue;
|
||||
logger?.LogInformation("{outputResolution}", outputResolution);
|
||||
exifDirectories = IFace.GetExifDirectories(appSettings.ResultSettings, appSettings.MetadataSettings, appSettings.DistanceSettings, appSettings.CompareSettings, compare, outputResolution);
|
||||
preFiltered = IDistance.GetPreFilterLocationContainer(appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections, keyValuePairs, exifDirectories);
|
||||
preFiltered = IDistance.GetPreFilterLocationContainer(appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
||||
if (preFiltered.Count == 0)
|
||||
continue;
|
||||
if (appSettings.CompareSettings.SaveExtractFaces)
|
||||
SaveExtractFaces(appSettings, preFiltered);
|
||||
distanceLimits = new(appSettings.DistanceSettings);
|
||||
postFiltered = IDistance.GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
||||
if (postFiltered.Count == 0)
|
||||
continue;
|
||||
matrix = IDistance.GetMatrixLocationContainers(appSettings.DistanceSettings, appSettings.CompareSettings, compare, mappedExifDirectoryWithEncoding, distanceLimits, postFiltered);
|
||||
matrix = IDistance.GetMatrixLocationContainers(appSettings.DistanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered);
|
||||
if (matrix.Count == 0)
|
||||
continue;
|
||||
onlyOne = IDistance.GetOnlyOne(appSettings.DistanceSettings, matrix);
|
||||
@ -167,4 +172,101 @@ public partial class Compare : ICompare, IDisposable
|
||||
return results;
|
||||
}
|
||||
|
||||
private void SaveExtractFaces(AppSettings appSettings, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer)
|
||||
{
|
||||
ReadOnlyCollection<string>? paths;
|
||||
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
|
||||
foreach (KeyValuePair<int, ReadOnlyDictionary<int, LocationContainer>> keyValuePair in mappedIdsThenWholePercentagesToLocationContainer)
|
||||
{
|
||||
foreach (KeyValuePair<int, LocationContainer> keyValue in keyValuePair.Value)
|
||||
{
|
||||
if (keyValue.Value.ExifDirectory is null || keyValue.Value.FaceFile?.Location is null)
|
||||
continue;
|
||||
if (rootDirectoryFileNameToPaths.TryGetValue(keyValue.Value.FilePath.FileNameFirstSegment, out paths))
|
||||
ExtractFace(keyValuePair.Key, keyValue.Key, keyValue.Value.ExifDirectory, keyValue.Value.FaceFile.Location, keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void SaveExtractFaces(AppSettings appSettings, ReadOnlyCollection<LocationContainer> preFiltered)
|
||||
{
|
||||
ReadOnlyCollection<string>? paths;
|
||||
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
|
||||
foreach (LocationContainer locationContainer in preFiltered)
|
||||
{
|
||||
if (locationContainer?.FilePath?.Id is null || locationContainer?.WholePercentages is null || locationContainer?.ExifDirectory is null || locationContainer?.FaceFile?.Location is null)
|
||||
continue;
|
||||
if (rootDirectoryFileNameToPaths.TryGetValue(locationContainer.FilePath.FileNameFirstSegment, out paths))
|
||||
ExtractFace(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer.ExifDirectory, locationContainer.FaceFile.Location, locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths);
|
||||
}
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<string, ReadOnlyCollection<string>> GetRootDirectoryFileNameToPaths(ResultSettings resultSettings, CompareSettings compareSettings)
|
||||
{
|
||||
Dictionary<string, ReadOnlyCollection<string>> results = [];
|
||||
string key;
|
||||
string extension;
|
||||
List<string>? collection;
|
||||
Dictionary<string, List<string>> keyValuePairs = [];
|
||||
string[] files = !compareSettings.SaveExtractFaces ? [] : Directory.GetFiles(resultSettings.RootDirectory, "*", SearchOption.AllDirectories);
|
||||
foreach (string file in files)
|
||||
{
|
||||
extension = Path.GetExtension(file);
|
||||
if (resultSettings.IgnoreExtensions.Contains(extension))
|
||||
continue;
|
||||
key = Path.GetFileNameWithoutExtension(file);
|
||||
if (!keyValuePairs.TryGetValue(key, out collection))
|
||||
{
|
||||
keyValuePairs.Add(key, []);
|
||||
if (!keyValuePairs.TryGetValue(key, out collection))
|
||||
throw new Exception();
|
||||
}
|
||||
collection.Add(file);
|
||||
}
|
||||
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
|
||||
results.Add(keyValuePair.Key, keyValuePair.Value.AsReadOnly());
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
|
||||
private static void ExtractFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? __, ReadOnlyCollection<string> paths)
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
foreach (string path in paths)
|
||||
{
|
||||
// RectangleF? rectangleF = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(faceFile);
|
||||
// if (rectangleF is null)
|
||||
// return;
|
||||
// RectangleF? rectangle = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(distanceSettings, wholePercentages.Value);
|
||||
// if (rectangle is null)
|
||||
// return;
|
||||
// if (rectangleF.Value.X != rectangle.Value.X
|
||||
// || rectangleF.Value.Y != rectangle.Value.Y
|
||||
// || rectangleF.Value.Height != rectangle.Value.Height
|
||||
// || rectangleF.Value.Width != rectangle.Value.Width)
|
||||
// return;
|
||||
// RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
|
||||
// if (rectangle is null)
|
||||
// return;
|
||||
width = location.Right - location.Left;
|
||||
height = location.Bottom - location.Top;
|
||||
ExtractFace(file: path,
|
||||
width: width,
|
||||
height: height,
|
||||
left: location.Left,
|
||||
top: location.Top,
|
||||
suffix: $"-{id}-{wholePercentages}-face.jpg");
|
||||
}
|
||||
}
|
||||
|
||||
private static void ExtractFace(string file, float width, float height, double left, double top, string suffix)
|
||||
{
|
||||
RectangleF rectangle = new((float)left, (float)top, width, height);
|
||||
using Bitmap source = new(file);
|
||||
using Bitmap bitmap = new((int)width, (int)height);
|
||||
using (Graphics graphics = Graphics.FromImage(bitmap))
|
||||
graphics.DrawImage(source, new RectangleF(0, 0, width, height), rectangle, GraphicsUnit.Pixel);
|
||||
bitmap.Save($"{file}{suffix}");
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user