Removed Rectangle from LocationContainer

mapped-ids-then-whole-percentages-to-location-container

save-extracted-face

save-extracted-java-script-object-notation
This commit is contained in:
2025-07-06 10:39:21 -07:00
parent aa8de2b985
commit e49290fb44
9 changed files with 216 additions and 148 deletions

View File

@ -63,10 +63,9 @@ public partial class Compare : ICompare, IDisposable
ReadOnlyDictionary<string, LocationContainer> onlyOne;
bool runToDoCollectionFirst = GetRunToDoCollectionFirst(appSettings, compare);
ReadOnlyCollections readOnlyCollections = GetReadOnlyCollections(appSettings);
ReadOnlyCollection<ExifDirectory> mappedExifDirectoryWithEncoding = GetMappedExifDirectoryWithEncoding(appSettings, compare, readOnlyCollections);
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer = IDistance.Extract(appSettings.DistanceSettings, appSettings.CompareSettings, compare, mappedExifDirectoryWithEncoding);
if (appSettings.CompareSettings.SaveExtractFaces)
SaveExtractFaces(appSettings, mappedIdsThenWholePercentagesToLocationContainer);
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer = GetMappedIdsThenWholePercentagesToLocationContainer(appSettings, compare, readOnlyCollections);
if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation)
SaveExtracted(appSettings, mappedIdsThenWholePercentagesToLocationContainer);
foreach (string outputResolution in appSettings.CompareSettings.OutputResolutions)
{
if (runToDoCollectionFirst || outputResolution.Any(char.IsNumber))
@ -76,8 +75,8 @@ public partial class Compare : ICompare, IDisposable
preFiltered = IDistance.GetPreFilterLocationContainer(appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
if (preFiltered.Count == 0)
continue;
if (appSettings.CompareSettings.SaveExtractFaces)
SaveExtractFaces(appSettings, preFiltered);
if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation)
SaveExtracted(appSettings, preFiltered);
distanceLimits = new(appSettings.DistanceSettings);
postFiltered = IDistance.GetPostFilterLocationContainer(preFiltered, distanceLimits);
if (postFiltered.Count == 0)
@ -160,19 +159,23 @@ public partial class Compare : ICompare, IDisposable
return result;
}
private static ReadOnlyCollection<ExifDirectory> GetMappedExifDirectoryWithEncoding(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
private static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMappedIdsThenWholePercentagesToLocationContainer(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
{
ReadOnlyCollection<ExifDirectory> results;
ReadOnlyCollection<ExifDirectory> exifDirectories = IDistance.GetMapped(appSettings.ResultSettings, appSettings.MetadataSettings, appSettings.PeopleSettings, appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections);
if (exifDirectories.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson)
throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!");
results = IDistance.GetMappedExifDirectoryWithEncoding(compare, exifDirectories);
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> results;
results = IDistance.GetMappedIdsThenWholePercentagesToLocationContainer(appSettings.ResultSettings,
appSettings.MetadataSettings,
appSettings.PeopleSettings,
appSettings.DistanceSettings,
appSettings.CompareSettings,
compare,
readOnlyCollections);
if (results.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson)
throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!");
return results;
}
private void SaveExtractFaces(AppSettings appSettings, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer)
private void SaveExtracted(AppSettings appSettings, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer)
{
ReadOnlyCollection<string>? paths;
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
@ -183,12 +186,17 @@ public partial class Compare : ICompare, IDisposable
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);
{
if (appSettings.CompareSettings.SaveExtractedFaces)
SaveExtractedFace(keyValuePair.Key, keyValue.Key, keyValue.Value.ExifDirectory, keyValue.Value.FaceFile.Location, keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths);
if (appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation && keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName is not null)
SaveExtractedJavaScriptObjectNotation(keyValuePair.Key, keyValue.Key, keyValue.Value, paths);
}
}
}
}
private static void SaveExtractFaces(AppSettings appSettings, ReadOnlyCollection<LocationContainer> preFiltered)
private static void SaveExtracted(AppSettings appSettings, ReadOnlyCollection<LocationContainer> preFiltered)
{
ReadOnlyCollection<string>? paths;
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
@ -197,7 +205,12 @@ public partial class Compare : ICompare, IDisposable
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);
{
if (appSettings.CompareSettings.SaveExtractedFaces)
SaveExtractedFace(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer.ExifDirectory, locationContainer.FaceFile.Location, locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths);
if (appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation && locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName is not null)
SaveExtractedJavaScriptObjectNotation(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer, paths);
}
}
}
@ -208,7 +221,7 @@ public partial class Compare : ICompare, IDisposable
string extension;
List<string>? collection;
Dictionary<string, List<string>> keyValuePairs = [];
string[] files = !compareSettings.SaveExtractFaces ? [] : Directory.GetFiles(resultSettings.RootDirectory, "*", SearchOption.AllDirectories);
string[] files = !compareSettings.SaveExtractedFaces && !compareSettings.SaveExtractedJavaScriptObjectNotation ? [] : Directory.GetFiles(resultSettings.RootDirectory, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
extension = Path.GetExtension(file);
@ -228,10 +241,11 @@ public partial class Compare : ICompare, IDisposable
return results.AsReadOnly();
}
private static void ExtractFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? __, ReadOnlyCollection<string> paths)
private static void SaveExtractedFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName, ReadOnlyCollection<string> paths)
{
int width;
int height;
string person;
foreach (string path in paths)
{
// RectangleF? rectangleF = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(faceFile);
@ -250,12 +264,13 @@ public partial class Compare : ICompare, IDisposable
// return;
width = location.Right - location.Left;
height = location.Bottom - location.Top;
person = personKeyFormattedAndKeyTicksAndDisplayDirectoryName is null ? string.Empty : $"-{personKeyFormattedAndKeyTicksAndDisplayDirectoryName.DisplayDirectoryName}";
ExtractFace(file: path,
width: width,
height: height,
left: location.Left,
top: location.Top,
suffix: $"-{id}-{wholePercentages}-face.jpg");
suffix: $"-{id}-{wholePercentages}{person}-face.jpg");
}
}
@ -269,4 +284,16 @@ public partial class Compare : ICompare, IDisposable
bitmap.Save($"{file}{suffix}");
}
private static void SaveExtractedJavaScriptObjectNotation(int id, int wholePercentages, LocationContainer locationContainer, ReadOnlyCollection<string> paths)
{
string file;
string json;
foreach (string path in paths)
{
json = locationContainer.GetWithoutEncoding();
file = $"{path}-{id}-{wholePercentages}.json";
_ = IPath.WriteAllText(file, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
}
}
}