_Original

This commit is contained in:
Mike Phares 2022-12-31 13:10:03 -07:00
parent 4b6811644c
commit 45f4401fa4
13 changed files with 197 additions and 141 deletions

View File

@ -240,7 +240,16 @@ public partial class Form : System.Windows.Forms.Form
{ {
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered; checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}"); checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}");
if (checkFile == fileHolder.FullName || File.Exists(checkFile)) if (checkFile == fileHolder.FullName)
continue;
for (int i = 0; i < int.MaxValue; i++)
{
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks + i}{checkFileExtension}");
if (File.Exists(checkFile))
continue;
break;
}
if (File.Exists(checkFile))
continue; continue;
File.Move(fileHolder.FullName, checkFile); File.Move(fileHolder.FullName, checkFile);
File.WriteAllText($"{checkFile}.id", $"{id.Value}{Environment.NewLine}{fileHolder.Name}"); File.WriteAllText($"{checkFile}.id", $"{id.Value}{Environment.NewLine}{fileHolder.Name}");

View File

@ -218,7 +218,7 @@ public class D_Face
} }
} }
private List<Shared.Models.Face> GetFaces(Shared.Models.Property property, MappingFromItem mappingFromItem, int outputResolutionWidth, int outputResolutionHeight, int outputResolutionOrientation, List<Location>? locations) private List<Shared.Models.Face> GetFaces(Shared.Models.Methods.IResize resize, string outputResolution, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> outputResolutionToResize, List<Location>? locations)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -237,6 +237,7 @@ public class D_Face
} }
if (unknownImage is not null) if (unknownImage is not null)
{ {
(int outputResolutionWidth, int outputResolutionHeight, int outputResolutionOrientation) = resize.Get(outputResolution, outputResolutionToResize);
List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection; List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection;
FaceRecognition faceRecognition = new(_Configuration.NumberOfJitters.Value, _Configuration.NumberOfTimesToUpsample.Value, _Model, _ModelParameter, _PredictorModel); FaceRecognition faceRecognition = new(_Configuration.NumberOfJitters.Value, _Configuration.NumberOfTimesToUpsample.Value, _Model, _ModelParameter, _PredictorModel);
collection = faceRecognition.GetCollection(unknownImage, locations, includeFaceEncoding: true, includeFaceParts: true); collection = faceRecognition.GetCollection(unknownImage, locations, includeFaceEncoding: true, includeFaceParts: true);
@ -297,7 +298,7 @@ public class D_Face
#pragma warning restore CA1416 #pragma warning restore CA1416
private static List<LocationContainer<MetadataExtractor.Directory>> GetCollection(int outputResolutionWidth, int outputResolutionHeight, List<LocationContainer<MetadataExtractor.Directory>> collection, List<Shared.Models.Face> faces) private static List<LocationContainer<MetadataExtractor.Directory>> GetCollection(Shared.Models.Methods.IResize resize, string outputResolution, List<LocationContainer<MetadataExtractor.Directory>> collection, Dictionary<string, int[]> outputResolutionToResize, List<Shared.Models.Face> faces)
{ {
List<LocationContainer<MetadataExtractor.Directory>> results = new(); List<LocationContainer<MetadataExtractor.Directory>> results = new();
string? json; string? json;
@ -305,7 +306,8 @@ public class D_Face
Location? location; Location? location;
Rectangle? rectangle; Rectangle? rectangle;
List<int> skip = new(); List<int> skip = new();
OutputResolution? outputResolution = null; OutputResolution? outputResolutionCheck = null;
(int outputResolutionWidth, int outputResolutionHeight, int outputResolutionOrientation) = resize.Get(outputResolution, outputResolutionToResize);
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
{ {
if (face.Location is null || face.OutputResolution is null) if (face.Location is null || face.OutputResolution is null)
@ -325,8 +327,8 @@ public class D_Face
json = Metadata.Models.Stateless.IMetadata.GetOutputResolution(locationContainer.Directories); json = Metadata.Models.Stateless.IMetadata.GetOutputResolution(locationContainer.Directories);
if (json is not null) if (json is not null)
{ {
outputResolution = JsonSerializer.Deserialize<OutputResolution>(json); outputResolutionCheck = JsonSerializer.Deserialize<OutputResolution>(json);
if (outputResolution is not null && (outputResolution.Width != outputResolutionWidth || outputResolution.Height != outputResolutionHeight)) if (outputResolutionCheck is not null && (outputResolutionCheck.Width != outputResolutionWidth || outputResolutionCheck.Height != outputResolutionHeight))
continue; continue;
} }
(width, height) = Get(locationContainer.File); (width, height) = Get(locationContainer.File);
@ -341,11 +343,11 @@ public class D_Face
} }
} }
if (results.Any()) if (results.Any())
outputResolution = null; outputResolutionCheck = null;
return results; return results;
} }
public List<Shared.Models.Face> GetFaces(string dResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem, int outputResolutionWidth, int outputResolutionHeight, int outputResolutionOrientation, List<LocationContainer<MetadataExtractor.Directory>>? collection, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) public List<Shared.Models.Face> GetFaces(Shared.Models.Methods.IResize resize, string outputResolution, string dResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> outputResolutionToResize, List<LocationContainer<MetadataExtractor.Directory>>? collection, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection)
{ {
List<Shared.Models.Face>? results; List<Shared.Models.Face>? results;
if (string.IsNullOrEmpty(dResultsFullGroupDirectory)) if (string.IsNullOrEmpty(dResultsFullGroupDirectory))
@ -388,18 +390,18 @@ public class D_Face
parseExceptions.Add(nameof(D_Face)); parseExceptions.Add(nameof(D_Face));
} }
} }
List<LocationContainer<MetadataExtractor.Directory>> containers; List<LocationContainer<MetadataExtractor.Directory>> locationContainers;
if (results is null || collection is null) if (results is null || collection is null)
containers = new(); locationContainers = new();
else else
containers = GetCollection(outputResolutionWidth, outputResolutionHeight, collection, results); locationContainers = GetCollection(resize, outputResolution, collection, outputResolutionToResize, results);
if (mappingFromPhotoPrismCollection is null || results is null) if (mappingFromPhotoPrismCollection is null || results is null)
locations = (from l in containers where l is not null select l.Location).ToList(); locations = (from l in locationContainers where l is not null select l.Location).ToList();
else else
locations = Shared.Models.Stateless.Methods.ILocation.GetLocations(mappingFromPhotoPrismCollection, results, containers); locations = Shared.Models.Stateless.Methods.ILocation.GetLocations(mappingFromPhotoPrismCollection, results, locationContainers);
if (results is null || (locations is not null && locations.Any())) if (results is null || (locations is not null && locations.Any()))
{ {
results = GetFaces(property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, locations); results = GetFaces(resize, outputResolution, property, mappingFromItem, outputResolutionToResize, locations);
if (!results.Any()) if (!results.Any())
File.Move(mappingFromItem.ResizedFileHolder.FullName, $"{mappingFromItem.ResizedFileHolder.FullName}.err"); File.Move(mappingFromItem.ResizedFileHolder.FullName, $"{mappingFromItem.ResizedFileHolder.FullName}.err");
else else

View File

@ -2,6 +2,7 @@
using Phares.Shared; using Phares.Shared;
using ShellProgressBar; using ShellProgressBar;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Text.Json; using System.Text.Json;
using View_by_Distance.Distance.Models; using View_by_Distance.Distance.Models;
@ -62,7 +63,7 @@ public partial class DlibDotNet
Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
_Log.Information(propertyConfiguration.RootDirectory); _Log.Information(propertyConfiguration.RootDirectory);
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false); Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
Verify(configuration); OpenPossibleDuplicates(configuration);
VerifyExtra(args, propertyConfiguration, configuration); VerifyExtra(args, propertyConfiguration, configuration);
_Configuration = configuration; _Configuration = configuration;
_Index = new(configuration); _Index = new(configuration);
@ -205,7 +206,7 @@ public partial class DlibDotNet
return result; return result;
} }
private void Verify(Models.Configuration configuration) private void OpenPossibleDuplicates(Models.Configuration configuration)
{ {
if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0]))
throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!"); throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!");
@ -289,13 +290,11 @@ public partial class DlibDotNet
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
string original = "Original";
List<Shared.Models.Face> faces; List<Shared.Models.Face> faces;
Shared.Models.Property property; Shared.Models.Property property;
long ticks = DateTime.Now.Ticks; long ticks = DateTime.Now.Ticks;
DateTime dateTime = DateTime.Now; DateTime dateTime = DateTime.Now;
List<string> parseExceptions = new(); List<string> parseExceptions = new();
Dictionary<string, int[]> imageResizeKeyValuePairs;
List<Tuple<string, DateTime>> subFileTuples = new(); List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
if (item.Property is not null && item.Property.Id is not null && !item.Any()) if (item.Property is not null && item.Property.Id is not null && !item.Any())
@ -343,33 +342,21 @@ public partial class DlibDotNet
(int metadataGroups, metadataCollection) = _Metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem); (int metadataGroups, metadataCollection) = _Metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem);
if (_AppSettings.MaxDegreeOfParallelism < 2) if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(B_Metadata.GetMetadataCollection)); ticks = LogDelta(ticks, nameof(B_Metadata.GetMetadataCollection));
imageResizeKeyValuePairs = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, original, metadataCollection, item.Property, mappingFromItem); Dictionary<string, int[]> outputResolutionToResize = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
if (_AppSettings.MaxDegreeOfParallelism < 2) if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.GetResizeKeyValuePairs)); ticks = LogDelta(ticks, nameof(C_Resize.GetResizeKeyValuePairs));
if (_Configuration.SaveResizedSubfiles) if (_Configuration.SaveResizedSubfiles)
{ {
_Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, original, imageResizeKeyValuePairs); _Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
if (_AppSettings.MaxDegreeOfParallelism < 2) if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.SaveResizedSubfile)); ticks = LogDelta(ticks, nameof(C_Resize.SaveResizedSubfile));
} }
else if (outputResolution == _Configuration.OutputResolutions[0] && false)
{
byte[] bytes = _Resize.GetResizedBytes(outputResolution, cResultsFullGroupDirectory, subFileTuples, item.Property, mappingFromItem, imageResizeKeyValuePairs);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.GetResizedBytes));
string path = Path.Combine(resizedFileHolder.DirectoryName, resizedFileHolder.NameWithoutExtension);
File.WriteAllBytes(path, bytes);
}
if (!mappingFromItem.ResizedFileHolder.Exists && !File.Exists(mappingFromItem.ResizedFileHolder.FullName)) if (!mappingFromItem.ResizedFileHolder.Exists && !File.Exists(mappingFromItem.ResizedFileHolder.FullName))
faces = new(); faces = new();
else if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution)) else if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution))
faces = new(); faces = new();
else else
{ {
int[] outputResolutionCollection = imageResizeKeyValuePairs[outputResolution];
int outputResolutionWidth = outputResolutionCollection[0];
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection; List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<LocationContainer<MetadataExtractor.Directory>>? collection; List<LocationContainer<MetadataExtractor.Directory>>? collection;
if (item.Property?.Id is null) if (item.Property?.Id is null)
@ -378,7 +365,7 @@ public partial class DlibDotNet
_ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection); _ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection);
if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection)) if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null; mappingFromPhotoPrismCollection = null;
faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, collection, mappingFromPhotoPrismCollection); faces = _Faces.GetFaces(_Resize, outputResolution, dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, collection, mappingFromPhotoPrismCollection);
if (_AppSettings.MaxDegreeOfParallelism < 2) if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(D_Face.GetFaces)); ticks = LogDelta(ticks, nameof(D_Face.GetFaces));
bool anyFacesSaved = _Faces.SaveFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces); bool anyFacesSaved = _Faces.SaveFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces);
@ -402,7 +389,7 @@ public partial class DlibDotNet
imageFaceCollections[index] = faces; imageFaceCollections[index] = faces;
propertyCollection[index] = property; propertyCollection[index] = property;
metadataCollections[index] = metadataCollection; metadataCollections[index] = metadataCollection;
resizeKeyValuePairs[index] = imageResizeKeyValuePairs; resizeKeyValuePairs[index] = outputResolutionToResize;
propertyFileHolderCollection[index] = item.ImageFileHolder; propertyFileHolderCollection[index] = item.ImageFileHolder;
sourceDirectoryChanges.AddRange(from l in subFileTuples where l.Item2 > dateTime select l); sourceDirectoryChanges.AddRange(from l in subFileTuples where l.Item2 > dateTime select l);
} }
@ -991,35 +978,81 @@ public partial class DlibDotNet
directories = new List<MetadataExtractor.Directory>(); directories = new List<MetadataExtractor.Directory>();
else else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
Rectangle? rectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(_Configuration.LocationDigits, normalizedRectangle.Value);
lock (collection) lock (collection)
collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, null, null)); collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, rectangle, null));
} }
private void Verify(List<LocationContainer<MetadataExtractor.Directory>> collection) private void OpenPossibleDuplicates(List<(long, int, string, double?)> duplicates)
{ {
string key;
int normalizedRectangle;
string personKeyFormatted; string personKeyFormatted;
Dictionary<string, int> distinct = new(); foreach ((long personKey, int id, string file, double? percent) in duplicates)
List<(long, int, string)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
{ {
key = string.Concat(locationContainer.PersonKey, locationContainer.Id); if (percent is null)
if (distinct.TryGetValue(key, out normalizedRectangle))
{
if (normalizedRectangle == locationContainer.NormalizedRectangle)
continue; continue;
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File));
continue;
}
distinct.Add(key, locationContainer.NormalizedRectangle);
}
(); //Do they also intersect?
foreach ((long personKey, int id, string file) in duplicates)
{
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\"")); _ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey); personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
} }
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
if (percent is not null && percent.Value == 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
}
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
if (percent is not null && percent.Value > 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
}
}
private void LookForPossibleDuplicates(List<LocationContainer<MetadataExtractor.Directory>> collection)
{
string key;
double? percent;
Rectangle? rectangle;
Rectangle intersectRectangle;
(string File, int NormalizedRectangle) item;
Dictionary<string, (string, int)> distinct = new();
List<(long, int, string, double?)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
{
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
if (distinct.TryGetValue(key, out item))
{
if (item.NormalizedRectangle == locationContainer.NormalizedRectangle)
continue;
if (locationContainer.Rectangle is null)
percent = null;
else
{
rectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(_Configuration.LocationDigits, item.NormalizedRectangle);
if (locationContainer.Rectangle is null || rectangle is null)
percent = null;
else
{
intersectRectangle = Rectangle.Intersect(locationContainer.Rectangle.Value, rectangle.Value);
percent = intersectRectangle.Width * intersectRectangle.Height;
}
}
if (!_Configuration.DeletePossibleDuplicates)
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent));
else
{
if (File.Exists(item.File))
File.Delete(item.File);
if (File.Exists(locationContainer.File))
File.Delete(locationContainer.File);
}
continue;
}
distinct.Add(key, new(locationContainer.File, locationContainer.NormalizedRectangle));
}
if (duplicates.Any() && _IsEnvironment.Development)
OpenPossibleDuplicates(duplicates);
} }
private List<LocationContainer<MetadataExtractor.Directory>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) private List<LocationContainer<MetadataExtractor.Directory>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
@ -1052,7 +1085,7 @@ public partial class DlibDotNet
ParallelFor(eDistanceContentDirectory, results, collection[i].PersonKey, collection[i].File); ParallelFor(eDistanceContentDirectory, results, collection[i].PersonKey, collection[i].File);
}); });
} }
Verify(results); LookForPossibleDuplicates(results);
return results; return results;
} }

View File

@ -13,6 +13,7 @@ public class Configuration
[Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; } [Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; }
[Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; } [Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; }
[Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } [Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; }
[Display(Name = "Delete Possible Duplicates"), Required] public bool? DeletePossibleDuplicates { get; set; }
[Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; } [Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; }
[Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; } [Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; }
[Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; } [Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; }
@ -99,6 +100,8 @@ public class Configuration
throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults));
if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null) if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null)
throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection));
if (configuration.DeletePossibleDuplicates is null)
throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates));
if (configuration.DistanceFactor is null) if (configuration.DistanceFactor is null)
throw new NullReferenceException(nameof(configuration.DistanceFactor)); throw new NullReferenceException(nameof(configuration.DistanceFactor));
if (configuration.DistanceMoveUnableToMatch is null) if (configuration.DistanceMoveUnableToMatch is null)
@ -215,6 +218,7 @@ public class Configuration
configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckDFaceAndUpWriteDates.Value,
configuration.CheckJsonForDistanceResults.Value, configuration.CheckJsonForDistanceResults.Value,
configuration.CrossDirectoryMaxItemsInDistanceCollection.Value, configuration.CrossDirectoryMaxItemsInDistanceCollection.Value,
configuration.DeletePossibleDuplicates.Value,
configuration.DistanceFactor.Value, configuration.DistanceFactor.Value,
configuration.DistanceMoveUnableToMatch.Value, configuration.DistanceMoveUnableToMatch.Value,
configuration.DistancePixelDistanceTolerance.Value, configuration.DistancePixelDistanceTolerance.Value,

View File

@ -12,6 +12,7 @@ public class Configuration
public bool CheckDFaceAndUpWriteDates { init; get; } public bool CheckDFaceAndUpWriteDates { init; get; }
public bool CheckJsonForDistanceResults { init; get; } public bool CheckJsonForDistanceResults { init; get; }
public int CrossDirectoryMaxItemsInDistanceCollection { init; get; } public int CrossDirectoryMaxItemsInDistanceCollection { init; get; }
public bool DeletePossibleDuplicates { get; internal set; }
public int DistanceFactor { init; get; } public int DistanceFactor { init; get; }
public bool DistanceMoveUnableToMatch { init; get; } public bool DistanceMoveUnableToMatch { init; get; }
public int DistancePixelDistanceTolerance { init; get; } public int DistancePixelDistanceTolerance { init; get; }
@ -81,6 +82,7 @@ public class Configuration
bool checkDFaceAndUpWriteDates, bool checkDFaceAndUpWriteDates,
bool checkJsonForDistanceResults, bool checkJsonForDistanceResults,
int crossDirectoryMaxItemsInDistanceCollection, int crossDirectoryMaxItemsInDistanceCollection,
bool deletePossibleDuplicates,
int distanceFactor, int distanceFactor,
bool distanceMoveUnableToMatch, bool distanceMoveUnableToMatch,
int distancePixelDistanceTolerance, int distancePixelDistanceTolerance,
@ -149,6 +151,7 @@ public class Configuration
CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates;
CheckJsonForDistanceResults = checkJsonForDistanceResults; CheckJsonForDistanceResults = checkJsonForDistanceResults;
CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection; CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
DeletePossibleDuplicates = deletePossibleDuplicates;
DistanceFactor = distanceFactor; DistanceFactor = distanceFactor;
DistanceMoveUnableToMatch = distanceMoveUnableToMatch; DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
DistancePixelDistanceTolerance = distancePixelDistanceTolerance; DistancePixelDistanceTolerance = distancePixelDistanceTolerance;

View File

@ -10,6 +10,7 @@
}, },
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DeletePossibleDuplicates": false,
"DistanceRenameToMatch": true, "DistanceRenameToMatch": true,
"DistanceMoveUnableToMatch": true, "DistanceMoveUnableToMatch": true,
"PersonCharacters": "!#]^_`~+", "PersonCharacters": "!#]^_`~+",
@ -32,13 +33,13 @@
"Julie" "Julie"
], ],
"LoadOrCreateThenSaveDistanceResultsForOutputResolutions": [ "LoadOrCreateThenSaveDistanceResultsForOutputResolutions": [
"7680 x 4320" "Original"
], ],
"LoadOrCreateThenSaveImageFacesResultsForOutputResolutions": [ "LoadOrCreateThenSaveImageFacesResultsForOutputResolutions": [
"7680 x 4320" "Original"
], ],
"OutputResolutions": [ "OutputResolutions": [
"7680 x 4320" "Original"
], ],
"PropertyContentCollectionFiles": [], "PropertyContentCollectionFiles": [],
"RangeDaysDeltaTolerance": [ "RangeDaysDeltaTolerance": [
@ -62,13 +63,13 @@
100 100
], ],
"SaveFaceDistancesForOutputResolutions": [ "SaveFaceDistancesForOutputResolutions": [
"7680 x 4320" "Original"
], ],
"SaveFaceLandmarkForOutputResolutions": [], "SaveFaceLandmarkForOutputResolutions": [],
"SaveFilteredOriginalImagesFromJLinksForOutputResolutions": [], "SaveFilteredOriginalImagesFromJLinksForOutputResolutions": [],
"SaveMappedForOutputResolutions": [], "SaveMappedForOutputResolutions": [],
"SaveRandomForOutputResolutions": [ "SaveRandomForOutputResolutions": [
"7680 x 4320" "Original"
], ],
"SaveShortcutsForOutputResolutions": [], "SaveShortcutsForOutputResolutions": [],
"IgnoreRelativePaths": [ "IgnoreRelativePaths": [

View File

@ -54,6 +54,7 @@
"CheckJsonForDistanceResults": false, "CheckJsonForDistanceResults": false,
"CrossDirectoryMaxItemsInDistanceCollection": 7, "CrossDirectoryMaxItemsInDistanceCollection": 7,
"DateGroup": "2022-12-30", "DateGroup": "2022-12-30",
"DeletePossibleDuplicates": false,
"DistanceFactor": 8, "DistanceFactor": 8,
"DistanceMoveUnableToMatch": false, "DistanceMoveUnableToMatch": false,
"DistancePixelDistanceTolerance": 1, "DistancePixelDistanceTolerance": 1,
@ -200,6 +201,7 @@
".TIFF" ".TIFF"
], ],
"ValidResolutions": [ "ValidResolutions": [
"Original",
"176 x 176", "176 x 176",
"256 x 256", "256 x 256",
"353 x 353", "353 x 353",

View File

@ -14,7 +14,7 @@ namespace View_by_Distance.Resize.Models;
/// <summary> /// <summary>
// Dictionary<string, int[]> // Dictionary<string, int[]>
/// </summary> /// </summary>
public class C_Resize public class C_Resize : Shared.Models.Methods.IResize
{ {
public List<string> AngleBracketCollection { get; } public List<string> AngleBracketCollection { get; }
@ -22,6 +22,7 @@ public class C_Resize
protected readonly string _FileNameExtension; protected readonly string _FileNameExtension;
public string FileNameExtension => _FileNameExtension; public string FileNameExtension => _FileNameExtension;
private readonly string _Original;
private readonly int _TempResolutionWidth; private readonly int _TempResolutionWidth;
private readonly int _TempResolutionHeight; private readonly int _TempResolutionHeight;
private readonly string[] _ValidResolutions; private readonly string[] _ValidResolutions;
@ -39,6 +40,7 @@ public class C_Resize
public C_Resize(bool forceResizeLastWriteTimeToCreationTime, bool overrideForResizeImages, bool propertiesChangedForResize, string[] validResolutions, ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) public C_Resize(bool forceResizeLastWriteTimeToCreationTime, bool overrideForResizeImages, bool propertiesChangedForResize, string[] validResolutions, ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension)
{ {
_Original = "Original";
_TempResolutionWidth = 3; _TempResolutionWidth = 3;
_TempResolutionHeight = 4; _TempResolutionHeight = 4;
_OutputResolutionWidthIndex = 0; _OutputResolutionWidthIndex = 0;
@ -175,9 +177,8 @@ public class C_Resize
} }
} }
private byte[] SaveResizedSubfile3(MappingFromItem mappingFromItem, int[] resize, bool returnAndDoNotWrite, byte[] bytes) private void SaveResizedSubfile3(MappingFromItem mappingFromItem, int[] resize, byte[] bytes)
{ {
byte[] results;
Bitmap bitmap; Bitmap bitmap;
int outputResolutionWidth = resize[_OutputResolutionWidthIndex]; int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false); using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false);
@ -215,21 +216,13 @@ public class C_Resize
default: default:
break; break;
} }
if (returnAndDoNotWrite)
results = GetBitmapData(bitmap);
else
{
results = Array.Empty<byte>();
CopyPropertyItems(bytes, propertyItems, bitmap); CopyPropertyItems(bytes, propertyItems, bitmap);
bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters); bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters);
}
bitmap.Dispose(); bitmap.Dispose();
return results;
} }
private byte[] SaveResizedSubfile5(MappingFromItem mappingFromItem, int[] resize, bool returnAndDoNotWrite, byte[] bytes) private void SaveResizedSubfile5(MappingFromItem mappingFromItem, int[] resize, byte[] bytes)
{ {
byte[] results;
Bitmap bitmap; Bitmap bitmap;
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false); using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false);
PropertyItem[] propertyItems = temp.PropertyItems; PropertyItem[] propertyItems = temp.PropertyItems;
@ -279,24 +272,16 @@ public class C_Resize
{ {
using (Graphics graphics = Graphics.FromImage(preRotated)) using (Graphics graphics = Graphics.FromImage(preRotated))
graphics.DrawImage(bitmap, new Rectangle(0, 0, outputResolutionWidth, outputResolutionHeight), rectangle, GraphicsUnit.Pixel); graphics.DrawImage(bitmap, new Rectangle(0, 0, outputResolutionWidth, outputResolutionHeight), rectangle, GraphicsUnit.Pixel);
if (returnAndDoNotWrite)
results = GetBitmapData(bitmap);
else
{
results = Array.Empty<byte>();
CopyPropertyItems(bytes, propertyItems, bitmap); CopyPropertyItems(bytes, propertyItems, bitmap);
bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters); bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters);
} }
}
bitmap.Dispose(); bitmap.Dispose();
return results;
} }
#pragma warning restore CA1416 #pragma warning restore CA1416
private byte[] SaveResizedSubfile(Shared.Models.Property property, MappingFromItem mappingFromItem, int[] resize, bool returnAndDoNotWrite) private void SaveResizedSubfile(Shared.Models.Property property, MappingFromItem mappingFromItem, int[] resize)
{ {
byte[] results;
// string subFile, Shared.Models.Property property, Shared.Models.FileHolder? fileHolder // string subFile, Shared.Models.Property property, Shared.Models.FileHolder? fileHolder
string dateTimeFormat = Shared.Models.Stateless.Methods.IProperty.DateTimeFormat(); string dateTimeFormat = Shared.Models.Stateless.Methods.IProperty.DateTimeFormat();
DateTime dateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(property); DateTime dateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(property);
@ -305,43 +290,37 @@ public class C_Resize
if (_ASCIIEncoding.GetString(bytes, 0, bytes.Length) != dateTimeValue) if (_ASCIIEncoding.GetString(bytes, 0, bytes.Length) != dateTimeValue)
throw new Exception(); throw new Exception();
if (resize.Length == 3) if (resize.Length == 3)
results = SaveResizedSubfile3(mappingFromItem, resize, returnAndDoNotWrite, bytes); SaveResizedSubfile3(mappingFromItem, resize, bytes);
else if (resize.Length == 5) else if (resize.Length == 5)
results = SaveResizedSubfile5(mappingFromItem, resize, returnAndDoNotWrite, bytes); SaveResizedSubfile5(mappingFromItem, resize, bytes);
else else
throw new Exception(); throw new Exception();
return results;
} }
public byte[] GetResizedBytes(string outputResolution, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> imageResizeKeyValuePairs) (int, int, int) Shared.Models.Methods.IResize.Get(string outputResolution, Dictionary<string, int[]> outputResolutionToResize)
{ {
byte[] results; int[] outputResolutionCollection = outputResolutionToResize[outputResolution];
if (!imageResizeKeyValuePairs.ContainsKey(outputResolution)) int outputResolutionWidth = outputResolutionCollection[0];
throw new Exception(); int outputResolutionHeight = outputResolutionCollection[1];
int[] resize = imageResizeKeyValuePairs[outputResolution]; int outputResolutionOrientation = outputResolutionCollection[2];
int outputResolutionWidth = resize[_OutputResolutionWidthIndex]; return new(outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation);
int outputResolutionHeight = resize[_OutputResolutionHeightIndex];
int outputResolutionOrientation = resize[_OutputResolutionOrientationIndex];
results = SaveResizedSubfile(property, mappingFromItem, resize, returnAndDoNotWrite: true);
subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now));
return results;
} }
public void SaveResizedSubfile(Property.Models.Configuration configuration, string outputResolution, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, Item item, Shared.Models.Property property, MappingFromItem mappingFromItem, string original, Dictionary<string, int[]> imageResizeKeyValuePairs) public void SaveResizedSubfile(Property.Models.Configuration configuration, string outputResolution, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, Item item, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> outputResolutionToResize)
{ {
if (mappingFromItem.ResizedFileHolder is null) if (mappingFromItem.ResizedFileHolder is null)
throw new NullReferenceException(nameof(mappingFromItem.ResizedFileHolder)); throw new NullReferenceException(nameof(mappingFromItem.ResizedFileHolder));
if (!imageResizeKeyValuePairs.ContainsKey(original)) if (!outputResolutionToResize.ContainsKey(_Original))
throw new Exception(); throw new Exception();
if (!imageResizeKeyValuePairs.ContainsKey(outputResolution)) if (!outputResolutionToResize.ContainsKey(outputResolution))
throw new Exception(); throw new Exception();
FileInfo fileInfo = new(mappingFromItem.ResizedFileHolder.FullName); FileInfo fileInfo = new(mappingFromItem.ResizedFileHolder.FullName);
bool check = false; bool check = false;
int[] resize = imageResizeKeyValuePairs[outputResolution]; int[] resize = outputResolutionToResize[outputResolution];
int outputResolutionWidth = resize[_OutputResolutionWidthIndex]; int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
int outputResolutionHeight = resize[_OutputResolutionHeightIndex]; int outputResolutionHeight = resize[_OutputResolutionHeightIndex];
int outputResolutionOrientation = resize[_OutputResolutionOrientationIndex]; int outputResolutionOrientation = resize[_OutputResolutionOrientationIndex];
int[] originalCollection = imageResizeKeyValuePairs[original]; int[] originalCollection = outputResolutionToResize[_Original];
string[] changesFrom = new string[] { nameof(Property.Models.A_Property), nameof(B_Metadata), nameof(C_Resize) }; string[] changesFrom = new string[] { nameof(Property.Models.A_Property), nameof(B_Metadata), nameof(C_Resize) };
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
if (_OverrideForResizeImages) if (_OverrideForResizeImages)
@ -367,7 +346,7 @@ public class C_Resize
check = true; check = true;
if (check) if (check)
{ {
_ = SaveResizedSubfile(property, mappingFromItem, resize, returnAndDoNotWrite: false); SaveResizedSubfile(property, mappingFromItem, resize);
item.SetResizedFileHolder(_FileNameExtension, Shared.Models.Stateless.Methods.IFileHolder.Refresh(mappingFromItem.ResizedFileHolder)); item.SetResizedFileHolder(_FileNameExtension, Shared.Models.Stateless.Methods.IFileHolder.Refresh(mappingFromItem.ResizedFileHolder));
subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now)); subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now));
} }
@ -395,7 +374,7 @@ public class C_Resize
return result; return result;
} }
private Dictionary<string, int[]> GetImageResizes(Shared.Models.Property property, List<KeyValuePair<string, string>> metadataCollection, string original) private Dictionary<string, int[]> GetImageResizes(Shared.Models.Property property, List<KeyValuePair<string, string>> metadataCollection)
{ {
Dictionary<string, int[]> results = new(); Dictionary<string, int[]> results = new();
int[] desired; int[] desired;
@ -412,12 +391,21 @@ public class C_Resize
orientation = GetOrientation(metadataCollection); orientation = GetOrientation(metadataCollection);
checkWidth = property.Width.Value; checkWidth = property.Width.Value;
checkHeight = property.Height.Value; checkHeight = property.Height.Value;
results.Add(original, new int[] { checkWidth, checkHeight, orientation }); if (!_ValidResolutions.Contains(_Original))
results.Add(_Original, new int[] { checkWidth, checkHeight, orientation });
foreach (string validResolution in _ValidResolutions) foreach (string validResolution in _ValidResolutions)
{
if (validResolution == _Original)
{
desiredWidth = checkWidth;
desiredHeight = checkHeight;
}
else
{ {
desired = GetCollection(validResolution); desired = GetCollection(validResolution);
desiredWidth = desired[0]; desiredWidth = desired[0];
desiredHeight = desired[1]; desiredHeight = desired[1];
}
if (checkWidth <= desiredWidth && checkHeight <= desiredHeight) if (checkWidth <= desiredWidth && checkHeight <= desiredHeight)
results.Add(validResolution, new int[] { checkWidth, checkHeight, orientation }); results.Add(validResolution, new int[] { checkWidth, checkHeight, orientation });
else else
@ -447,9 +435,9 @@ public class C_Resize
return result; return result;
} }
public Dictionary<string, int[]> GetResizeKeyValuePairs(Property.Models.Configuration configuration, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, string original, List<KeyValuePair<string, string>> metadataCollection, Shared.Models.Property property, MappingFromItem mappingFromItem) public Dictionary<string, int[]> GetResizeKeyValuePairs(Property.Models.Configuration configuration, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, List<KeyValuePair<string, string>> metadataCollection, Shared.Models.Property property, MappingFromItem mappingFromItem)
{ {
Dictionary<string, int[]> results; Dictionary<string, int[]>? results;
string json; string json;
string[] changesFrom = new string[] { nameof(Property.Models.A_Property), nameof(B_Metadata) }; string[] changesFrom = new string[] { nameof(Property.Models.A_Property), nameof(B_Metadata) };
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
@ -466,40 +454,32 @@ public class C_Resize
fileInfo.Refresh(); fileInfo.Refresh();
} }
if (_PropertiesChangedForResize) if (_PropertiesChangedForResize)
results = new(); results = null;
else if (!fileInfo.Exists) else if (!fileInfo.Exists)
results = new(); results = null;
else if (!fileInfo.FullName.EndsWith(".json") && !fileInfo.FullName.EndsWith(".old")) else if (!fileInfo.FullName.EndsWith(".json") && !fileInfo.FullName.EndsWith(".old"))
throw new ArgumentException("must be a *.json file"); throw new ArgumentException("must be a *.json file");
else if (dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime) else if (dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime)
results = new(); results = null;
else else
{ {
json = File.ReadAllText(fileInfo.FullName); json = File.ReadAllText(fileInfo.FullName);
try try
{ {
Dictionary<string, int[]>? keyValuePairs; results = JsonSerializer.Deserialize<Dictionary<string, int[]>>(json);
keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, int[]>>(json); if (results is null)
if (keyValuePairs is null)
throw new Exception(); throw new Exception();
results = keyValuePairs;
if ((from l in results where l.Value[0] == l.Value[1] select true).Any())
{
results = GetImageResizes(property, metadataCollection, original);
if (!(from l in results where l.Value[0] == l.Value[1] select true).Any())
throw new Exception("Was square!");
}
subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), fileInfo.LastWriteTime)); subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), fileInfo.LastWriteTime));
} }
catch (Exception) catch (Exception)
{ {
results = new(); results = null;
parseExceptions.Add(nameof(C_Resize)); parseExceptions.Add(nameof(C_Resize));
} }
} }
if (results is null || !results.Any()) if (results is null)
{ {
results = GetImageResizes(property, metadataCollection, original); results = GetImageResizes(property, metadataCollection);
json = JsonSerializer.Serialize(results, _WriteIndentedJsonSerializerOptions); json = JsonSerializer.Serialize(results, _WriteIndentedJsonSerializerOptions);
bool updateDateWhenMatches = dateTimes.Any() && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime; bool updateDateWhenMatches = dateTimes.Any() && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime;
DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max(); DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max();

View File

@ -0,0 +1,8 @@
namespace View_by_Distance.Shared.Models.Methods;
public interface IResize
{
(int, int, int) Get(string outputResolution, Dictionary<string, int[]> outputResolutionToResize);
}

View File

@ -30,12 +30,17 @@ public interface ILocation
static List<Models.Location> GetLocations<T>(List<MappingFromPhotoPrism> mappingFromPhotoPrismCollection, List<Models.Face> faces, List<LocationContainer<T>> containers) => static List<Models.Location> GetLocations<T>(List<MappingFromPhotoPrism> mappingFromPhotoPrismCollection, List<Models.Face> faces, List<LocationContainer<T>> containers) =>
Location.GetLocations(mappingFromPhotoPrismCollection, faces, containers); Location.GetLocations(mappingFromPhotoPrismCollection, faces, containers);
Rectangle? TestStatic_GetNormalizedRectangle(int locationDigits, int normalizedRectangle) =>
GetNormalizedRectangle(locationDigits, normalizedRectangle);
static Rectangle? GetNormalizedRectangle(int locationDigits, int normalizedRectangle) =>
Location.GetNormalizedRectangle(locationDigits, normalizedRectangle.ToString());
Rectangle? TestStatic_GetRectangle(Rectangle checkRectangle, int locationDigits, int locationFactor, int normalizedRectangle, Models.OutputResolution outputResolution, bool useOldWay) => Rectangle? TestStatic_GetRectangle(Rectangle checkRectangle, int locationDigits, int locationFactor, int normalizedRectangle, Models.OutputResolution outputResolution, bool useOldWay) =>
GetRectangle(checkRectangle, locationDigits, locationFactor, normalizedRectangle, outputResolution, useOldWay); GetRectangle(checkRectangle, locationDigits, locationFactor, normalizedRectangle, outputResolution, useOldWay);
static Rectangle? GetRectangle(Rectangle checkRectangle, int locationDigits, int locationFactor, int normalizedRectangle, Models.OutputResolution outputResolution, bool useOldWay) => static Rectangle? GetRectangle(Rectangle checkRectangle, int locationDigits, int locationFactor, int normalizedRectangle, Models.OutputResolution outputResolution, bool useOldWay) =>
Location.GetRectangle(checkRectangle, OutputResolution.Get(outputResolution).Height, locationDigits, locationFactor, normalizedRectangle.ToString(), OutputResolution.Get(outputResolution).Width, useOldWay); Location.GetRectangle(checkRectangle, OutputResolution.Get(outputResolution).Height, locationDigits, locationFactor, normalizedRectangle.ToString(), OutputResolution.Get(outputResolution).Width, useOldWay);
Rectangle? TestStatic_GetRectangle(int height, int locationDigits, int locationFactor, int normalizedRectangle, int outputResolutionHeight, int outputResolutionWidth, int width) => Rectangle? TestStatic_GetRectangle(int height, int locationDigits, int locationFactor, int normalizedRectangle, int outputResolutionHeight, int outputResolutionWidth, int width) =>
GetRectangle(height, locationDigits, locationFactor, normalizedRectangle, outputResolutionHeight, outputResolutionWidth, width); GetRectangle(height, locationDigits, locationFactor, normalizedRectangle, outputResolutionHeight, outputResolutionWidth, width);
static Rectangle? GetRectangle(int height, int locationDigits, int locationFactor, int normalizedRectangle, int outputResolutionHeight, int outputResolutionWidth, int width) => static Rectangle? GetRectangle(int height, int locationDigits, int locationFactor, int normalizedRectangle, int outputResolutionHeight, int outputResolutionWidth, int width) =>
Location.GetRectangle(height, locationDigits, locationFactor, normalizedRectangle.ToString(), outputResolutionHeight, outputResolutionWidth, width); Location.GetRectangle(height, locationDigits, locationFactor, normalizedRectangle.ToString(), outputResolutionHeight, outputResolutionWidth, width);

View File

@ -140,7 +140,7 @@ internal abstract class Location
return result; return result;
} }
private static Rectangle? GetRectangle(int locationDigits, int height, string normalizedRectangle, int width) internal static Rectangle? GetNormalizedRectangle(int locationDigits, string normalizedRectangle)
{ {
Rectangle? result; Rectangle? result;
int length = (locationDigits - 1) / 4; int length = (locationDigits - 1) / 4;
@ -158,11 +158,22 @@ internal abstract class Location
{ {
if (!int.TryParse(segments[1], out int xNormalized) || !int.TryParse(segments[2], out int yNormalized) || !int.TryParse(segments[3], out int wNormalized) || !int.TryParse(segments[4], out int hNormalized)) if (!int.TryParse(segments[1], out int xNormalized) || !int.TryParse(segments[2], out int yNormalized) || !int.TryParse(segments[3], out int wNormalized) || !int.TryParse(segments[4], out int hNormalized))
result = null; result = null;
else
result = new(xNormalized, yNormalized, wNormalized, hNormalized);
}
return result;
}
private static Rectangle? GetRectangle(int locationDigits, int height, string normalizedRectangle, int width)
{
Rectangle? result;
Rectangle? rectangle = GetNormalizedRectangle(locationDigits, normalizedRectangle);
if (rectangle is null)
result = null;
else else
{ {
decimal factor = 100; decimal factor = 100;
result = new((int)(xNormalized / factor * width), (int)(yNormalized / factor * height), (int)(wNormalized / factor * width), (int)(hNormalized / factor * height)); result = new((int)(rectangle.Value.X / factor * width), (int)(rectangle.Value.Y / factor * height), (int)(rectangle.Value.Width / factor * width), (int)(rectangle.Value.Height / factor * height));
}
} }
return result; return result;
} }

View File

@ -101,14 +101,13 @@ public class UnitTestResize
Item item; Item item;
bool reverse = false; bool reverse = false;
FileHolder resizedFileHolder; FileHolder resizedFileHolder;
string original = "Original";
string aResultsFullGroupDirectory; string aResultsFullGroupDirectory;
string bResultsFullGroupDirectory; string bResultsFullGroupDirectory;
string cResultsFullGroupDirectory; string cResultsFullGroupDirectory;
List<string> parseExceptions = new(); List<string> parseExceptions = new();
bool isValidImageFormatExtension = true; bool isValidImageFormatExtension = true;
Shared.Models.Property? property = null; Shared.Models.Property? property = null;
Dictionary<string, int[]> imageResizeKeyValuePairs; Dictionary<string, int[]> outputResolutionToResize;
List<Tuple<string, DateTime>> subFileTuples = new(); List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length; int length = _PropertyConfiguration.RootDirectory.Length;
@ -148,9 +147,9 @@ public class UnitTestResize
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
(int _, metadataCollection) = metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem); (int _, metadataCollection) = metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem);
imageResizeKeyValuePairs = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, original, metadataCollection, item.Property, mappingFromItem); outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
Assert.IsNotNull(mappingFromItem.ResizedFileHolder); Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, original, imageResizeKeyValuePairs); resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
} }
} }

View File

@ -175,7 +175,6 @@ public class UnitTestFace
string sourceDirectoryName = "zzz Portrait Innovations Files 2007"; string sourceDirectoryName = "zzz Portrait Innovations Files 2007";
Item item; Item item;
bool reverse = false; bool reverse = false;
string original = "Original";
FileHolder resizedFileHolder; FileHolder resizedFileHolder;
string aResultsFullGroupDirectory; string aResultsFullGroupDirectory;
string bResultsFullGroupDirectory; string bResultsFullGroupDirectory;
@ -183,7 +182,7 @@ public class UnitTestFace
List<string> parseExceptions = new(); List<string> parseExceptions = new();
bool isValidImageFormatExtension = true; bool isValidImageFormatExtension = true;
Shared.Models.Property? property = null; Shared.Models.Property? property = null;
Dictionary<string, int[]> imageResizeKeyValuePairs; Dictionary<string, int[]> outputResolutionToResize;
List<Tuple<string, DateTime>> subFileTuples = new(); List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length; int length = _PropertyConfiguration.RootDirectory.Length;
@ -223,9 +222,9 @@ public class UnitTestFace
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
(int _, metadataCollection) = metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem); (int _, metadataCollection) = metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem);
imageResizeKeyValuePairs = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, original, metadataCollection, item.Property, mappingFromItem); outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
Assert.IsNotNull(mappingFromItem.ResizedFileHolder); Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, original, imageResizeKeyValuePairs); resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
Image image = FaceRecognition.LoadImageFile(mappingFromItem.ResizedFileHolder.FullName); Image image = FaceRecognition.LoadImageFile(mappingFromItem.ResizedFileHolder.FullName);
Assert.IsNotNull(image); Assert.IsNotNull(image);
(Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(_Configuration); (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(_Configuration);