_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;
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;
File.Move(fileHolder.FullName, checkFile);
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)
throw new NullReferenceException(nameof(_Log));
@ -237,6 +237,7 @@ public class D_Face
}
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;
FaceRecognition faceRecognition = new(_Configuration.NumberOfJitters.Value, _Configuration.NumberOfTimesToUpsample.Value, _Model, _ModelParameter, _PredictorModel);
collection = faceRecognition.GetCollection(unknownImage, locations, includeFaceEncoding: true, includeFaceParts: true);
@ -297,7 +298,7 @@ public class D_Face
#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();
string? json;
@ -305,7 +306,8 @@ public class D_Face
Location? location;
Rectangle? rectangle;
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)
{
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);
if (json is not null)
{
outputResolution = JsonSerializer.Deserialize<OutputResolution>(json);
if (outputResolution is not null && (outputResolution.Width != outputResolutionWidth || outputResolution.Height != outputResolutionHeight))
outputResolutionCheck = JsonSerializer.Deserialize<OutputResolution>(json);
if (outputResolutionCheck is not null && (outputResolutionCheck.Width != outputResolutionWidth || outputResolutionCheck.Height != outputResolutionHeight))
continue;
}
(width, height) = Get(locationContainer.File);
@ -341,11 +343,11 @@ public class D_Face
}
}
if (results.Any())
outputResolution = null;
outputResolutionCheck = null;
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;
if (string.IsNullOrEmpty(dResultsFullGroupDirectory))
@ -388,18 +390,18 @@ public class D_Face
parseExceptions.Add(nameof(D_Face));
}
}
List<LocationContainer<MetadataExtractor.Directory>> containers;
List<LocationContainer<MetadataExtractor.Directory>> locationContainers;
if (results is null || collection is null)
containers = new();
locationContainers = new();
else
containers = GetCollection(outputResolutionWidth, outputResolutionHeight, collection, results);
locationContainers = GetCollection(resize, outputResolution, collection, outputResolutionToResize, results);
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
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()))
{
results = GetFaces(property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, locations);
results = GetFaces(resize, outputResolution, property, mappingFromItem, outputResolutionToResize, locations);
if (!results.Any())
File.Move(mappingFromItem.ResizedFileHolder.FullName, $"{mappingFromItem.ResizedFileHolder.FullName}.err");
else

View File

@ -2,6 +2,7 @@
using Phares.Shared;
using ShellProgressBar;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text.Json;
using View_by_Distance.Distance.Models;
@ -62,7 +63,7 @@ public partial class DlibDotNet
Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
_Log.Information(propertyConfiguration.RootDirectory);
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
Verify(configuration);
OpenPossibleDuplicates(configuration);
VerifyExtra(args, propertyConfiguration, configuration);
_Configuration = configuration;
_Index = new(configuration);
@ -205,7 +206,7 @@ public partial class DlibDotNet
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]))
throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!");
@ -289,13 +290,11 @@ public partial class DlibDotNet
{
if (_Log is null)
throw new NullReferenceException(nameof(_Log));
string original = "Original";
List<Shared.Models.Face> faces;
Shared.Models.Property property;
long ticks = DateTime.Now.Ticks;
DateTime dateTime = DateTime.Now;
List<string> parseExceptions = new();
Dictionary<string, int[]> imageResizeKeyValuePairs;
List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection;
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);
if (_AppSettings.MaxDegreeOfParallelism < 2)
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)
ticks = LogDelta(ticks, nameof(C_Resize.GetResizeKeyValuePairs));
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)
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))
faces = new();
else if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution))
faces = new();
else
{
int[] outputResolutionCollection = imageResizeKeyValuePairs[outputResolution];
int outputResolutionWidth = outputResolutionCollection[0];
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<LocationContainer<MetadataExtractor.Directory>>? collection;
if (item.Property?.Id is null)
@ -378,7 +365,7 @@ public partial class DlibDotNet
_ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection);
if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
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)
ticks = LogDelta(ticks, nameof(D_Face.GetFaces));
bool anyFacesSaved = _Faces.SaveFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces);
@ -402,7 +389,7 @@ public partial class DlibDotNet
imageFaceCollections[index] = faces;
propertyCollection[index] = property;
metadataCollections[index] = metadataCollection;
resizeKeyValuePairs[index] = imageResizeKeyValuePairs;
resizeKeyValuePairs[index] = outputResolutionToResize;
propertyFileHolderCollection[index] = item.ImageFileHolder;
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>();
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
Rectangle? rectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(_Configuration.LocationDigits, normalizedRectangle.Value);
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;
Dictionary<string, int> distinct = new();
List<(long, int, string)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
if (distinct.TryGetValue(key, out normalizedRectangle))
{
if (normalizedRectangle == locationContainer.NormalizedRectangle)
if (percent is null)
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), "\""));
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)
@ -1052,7 +1085,7 @@ public partial class DlibDotNet
ParallelFor(eDistanceContentDirectory, results, collection[i].PersonKey, collection[i].File);
});
}
Verify(results);
LookForPossibleDuplicates(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 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 = "Delete Possible Duplicates"), Required] public bool? DeletePossibleDuplicates { 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 Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; }
@ -99,6 +100,8 @@ public class Configuration
throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults));
if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null)
throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection));
if (configuration.DeletePossibleDuplicates is null)
throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates));
if (configuration.DistanceFactor is null)
throw new NullReferenceException(nameof(configuration.DistanceFactor));
if (configuration.DistanceMoveUnableToMatch is null)
@ -215,6 +218,7 @@ public class Configuration
configuration.CheckDFaceAndUpWriteDates.Value,
configuration.CheckJsonForDistanceResults.Value,
configuration.CrossDirectoryMaxItemsInDistanceCollection.Value,
configuration.DeletePossibleDuplicates.Value,
configuration.DistanceFactor.Value,
configuration.DistanceMoveUnableToMatch.Value,
configuration.DistancePixelDistanceTolerance.Value,

View File

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

View File

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

View File

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

View File

@ -14,7 +14,7 @@ namespace View_by_Distance.Resize.Models;
/// <summary>
// Dictionary<string, int[]>
/// </summary>
public class C_Resize
public class C_Resize : Shared.Models.Methods.IResize
{
public List<string> AngleBracketCollection { get; }
@ -22,6 +22,7 @@ public class C_Resize
protected readonly string _FileNameExtension;
public string FileNameExtension => _FileNameExtension;
private readonly string _Original;
private readonly int _TempResolutionWidth;
private readonly int _TempResolutionHeight;
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)
{
_Original = "Original";
_TempResolutionWidth = 3;
_TempResolutionHeight = 4;
_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;
int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false);
@ -215,21 +216,13 @@ public class C_Resize
default:
break;
}
if (returnAndDoNotWrite)
results = GetBitmapData(bitmap);
else
{
results = Array.Empty<byte>();
CopyPropertyItems(bytes, propertyItems, bitmap);
bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters);
}
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;
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false);
PropertyItem[] propertyItems = temp.PropertyItems;
@ -279,24 +272,16 @@ public class C_Resize
{
using (Graphics graphics = Graphics.FromImage(preRotated))
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);
bitmap.Save(mappingFromItem.ResizedFileHolder.FullName, _ImageCodecInfo, _EncoderParameters);
}
}
bitmap.Dispose();
return results;
}
#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 dateTimeFormat = Shared.Models.Stateless.Methods.IProperty.DateTimeFormat();
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)
throw new Exception();
if (resize.Length == 3)
results = SaveResizedSubfile3(mappingFromItem, resize, returnAndDoNotWrite, bytes);
SaveResizedSubfile3(mappingFromItem, resize, bytes);
else if (resize.Length == 5)
results = SaveResizedSubfile5(mappingFromItem, resize, returnAndDoNotWrite, bytes);
SaveResizedSubfile5(mappingFromItem, resize, bytes);
else
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;
if (!imageResizeKeyValuePairs.ContainsKey(outputResolution))
throw new Exception();
int[] resize = imageResizeKeyValuePairs[outputResolution];
int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
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;
int[] outputResolutionCollection = outputResolutionToResize[outputResolution];
int outputResolutionWidth = outputResolutionCollection[0];
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
return new(outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation);
}
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)
throw new NullReferenceException(nameof(mappingFromItem.ResizedFileHolder));
if (!imageResizeKeyValuePairs.ContainsKey(original))
if (!outputResolutionToResize.ContainsKey(_Original))
throw new Exception();
if (!imageResizeKeyValuePairs.ContainsKey(outputResolution))
if (!outputResolutionToResize.ContainsKey(outputResolution))
throw new Exception();
FileInfo fileInfo = new(mappingFromItem.ResizedFileHolder.FullName);
bool check = false;
int[] resize = imageResizeKeyValuePairs[outputResolution];
int[] resize = outputResolutionToResize[outputResolution];
int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
int outputResolutionHeight = resize[_OutputResolutionHeightIndex];
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) };
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
if (_OverrideForResizeImages)
@ -367,7 +346,7 @@ public class C_Resize
check = true;
if (check)
{
_ = SaveResizedSubfile(property, mappingFromItem, resize, returnAndDoNotWrite: false);
SaveResizedSubfile(property, mappingFromItem, resize);
item.SetResizedFileHolder(_FileNameExtension, Shared.Models.Stateless.Methods.IFileHolder.Refresh(mappingFromItem.ResizedFileHolder));
subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now));
}
@ -395,7 +374,7 @@ public class C_Resize
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();
int[] desired;
@ -412,12 +391,21 @@ public class C_Resize
orientation = GetOrientation(metadataCollection);
checkWidth = property.Width.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)
{
if (validResolution == _Original)
{
desiredWidth = checkWidth;
desiredHeight = checkHeight;
}
else
{
desired = GetCollection(validResolution);
desiredWidth = desired[0];
desiredHeight = desired[1];
}
if (checkWidth <= desiredWidth && checkHeight <= desiredHeight)
results.Add(validResolution, new int[] { checkWidth, checkHeight, orientation });
else
@ -447,9 +435,9 @@ public class C_Resize
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[] 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();
@ -466,40 +454,32 @@ public class C_Resize
fileInfo.Refresh();
}
if (_PropertiesChangedForResize)
results = new();
results = null;
else if (!fileInfo.Exists)
results = new();
results = null;
else if (!fileInfo.FullName.EndsWith(".json") && !fileInfo.FullName.EndsWith(".old"))
throw new ArgumentException("must be a *.json file");
else if (dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime)
results = new();
results = null;
else
{
json = File.ReadAllText(fileInfo.FullName);
try
{
Dictionary<string, int[]>? keyValuePairs;
keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, int[]>>(json);
if (keyValuePairs is null)
results = JsonSerializer.Deserialize<Dictionary<string, int[]>>(json);
if (results is null)
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));
}
catch (Exception)
{
results = new();
results = null;
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);
bool updateDateWhenMatches = dateTimes.Any() && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime;
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) =>
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) =>
GetRectangle(checkRectangle, locationDigits, locationFactor, normalizedRectangle, outputResolution, 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);
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);
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);

View File

@ -140,7 +140,7 @@ internal abstract class Location
return result;
}
private static Rectangle? GetRectangle(int locationDigits, int height, string normalizedRectangle, int width)
internal static Rectangle? GetNormalizedRectangle(int locationDigits, string normalizedRectangle)
{
Rectangle? result;
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))
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
{
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;
}

View File

@ -101,14 +101,13 @@ public class UnitTestResize
Item item;
bool reverse = false;
FileHolder resizedFileHolder;
string original = "Original";
string aResultsFullGroupDirectory;
string bResultsFullGroupDirectory;
string cResultsFullGroupDirectory;
List<string> parseExceptions = new();
bool isValidImageFormatExtension = true;
Shared.Models.Property? property = null;
Dictionary<string, int[]> imageResizeKeyValuePairs;
Dictionary<string, int[]> outputResolutionToResize;
List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length;
@ -148,9 +147,9 @@ public class UnitTestResize
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
(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);
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";
Item item;
bool reverse = false;
string original = "Original";
FileHolder resizedFileHolder;
string aResultsFullGroupDirectory;
string bResultsFullGroupDirectory;
@ -183,7 +182,7 @@ public class UnitTestFace
List<string> parseExceptions = new();
bool isValidImageFormatExtension = true;
Shared.Models.Property? property = null;
Dictionary<string, int[]> imageResizeKeyValuePairs;
Dictionary<string, int[]> outputResolutionToResize;
List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length;
@ -223,9 +222,9 @@ public class UnitTestFace
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
(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);
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);
Assert.IsNotNull(image);
(Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(_Configuration);