MapFaceFileLogic
Author:
This commit is contained in:
@ -6,6 +6,7 @@ using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using View_by_Distance.FaceRecognitionDotNet;
|
||||
using View_by_Distance.Metadata.Models;
|
||||
using View_by_Distance.Metadata.Models.Stateless.Methods;
|
||||
using View_by_Distance.Property.Models;
|
||||
using View_by_Distance.Resize.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
@ -149,7 +150,7 @@ public class D_Face : IFaceD
|
||||
|
||||
#pragma warning disable CA1416
|
||||
|
||||
private void SaveFaces(FileHolder resizedFileHolder, MetadataExtractor.GeoLocation? geoLocation, string? maker, string? model, List<(Shared.Models.Face, FileInfo?, string, bool)> collection)
|
||||
private void SaveFaces(FileHolder resizedFileHolder, ExifDirectory exifDirectory, List<(Shared.Models.Face, FileHolder?, string, bool)> collection)
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
@ -162,17 +163,27 @@ public class D_Face : IFaceD
|
||||
string faceFileJson;
|
||||
string faceEncodingJson;
|
||||
PropertyItem? propertyItem;
|
||||
string? maker = IMetadata.GetMaker(exifDirectory);
|
||||
string? model = IMetadata.GetModel(exifDirectory);
|
||||
using Bitmap source = new(resizedFileHolder.FullName);
|
||||
int artist = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagArtist;
|
||||
int userComment = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagUserComment;
|
||||
foreach ((Shared.Models.Face face, FileInfo? fileInfo, string fileName, bool save) in collection)
|
||||
MetadataExtractor.GeoLocation? geoLocation = IMetadata.GeoLocation(exifDirectory);
|
||||
const int artist = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagArtist; // 315
|
||||
const int userComment = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagUserComment;
|
||||
foreach ((Shared.Models.Face face, FileHolder? fileHolder, string fileName, bool save) in collection)
|
||||
{
|
||||
if (!save)
|
||||
continue;
|
||||
if (fileInfo is null)
|
||||
if (fileHolder is null)
|
||||
continue;
|
||||
if (face.FaceEncoding is null || face?.Location is null || face?.OutputResolution is null)
|
||||
continue;
|
||||
if (_OverrideForFaceImages && fileHolder.Exists)
|
||||
{
|
||||
IFaceD dFace = this;
|
||||
FilePath filePath = FilePath.Get(_PropertyConfiguration, fileHolder, index: null);
|
||||
dFace.ReSaveFace(exifDirectory, filePath, face, mappedFile: false);
|
||||
continue;
|
||||
}
|
||||
location = Shared.Models.Stateless.Methods.ILocation.GetLocation(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, source.Height, source.Width, collection.Count);
|
||||
if (location is null)
|
||||
continue;
|
||||
@ -180,7 +191,15 @@ public class D_Face : IFaceD
|
||||
height = location.Bottom - location.Top;
|
||||
faceEncodingJson = JsonSerializer.Serialize(face.FaceEncoding);
|
||||
rectangle = new Rectangle(location.Left, location.Top, width, height);
|
||||
faceFile = new(face.DateTime, geoLocation?.ToDmsString(), face.FaceParts, face.Location, maker, model, face.OutputResolution);
|
||||
faceFile = new(face.Mapping?.MappingFromLocation?.AreaPermyriad,
|
||||
face.Mapping?.MappingFromLocation?.ConfidencePercent,
|
||||
face.DateTime,
|
||||
geoLocation?.ToDmsString(),
|
||||
face.FaceParts,
|
||||
face.Location,
|
||||
maker,
|
||||
model,
|
||||
face.OutputResolution);
|
||||
faceFileJson = JsonSerializer.Serialize(faceFile, FaceFileGenerationContext.Default.FaceFile);
|
||||
using (bitmap = new(width, height))
|
||||
{
|
||||
@ -190,7 +209,7 @@ public class D_Face : IFaceD
|
||||
bitmap.SetPropertyItem(propertyItem);
|
||||
propertyItem = Property.Models.Stateless.IProperty.GetPropertyItem(_ConstructorInfo, userComment, type, faceEncodingJson);
|
||||
bitmap.SetPropertyItem(propertyItem);
|
||||
bitmap.Save(fileInfo.FullName, _ImageCodecInfo, _EncoderParameters);
|
||||
bitmap.Save(fileHolder.FullName, _ImageCodecInfo, _EncoderParameters);
|
||||
}
|
||||
if (File.Exists(fileName))
|
||||
File.Delete(fileName);
|
||||
@ -330,11 +349,12 @@ public class D_Face : IFaceD
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<(Shared.Models.Face, FileInfo?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, ExifDirectory exifDirectory, List<Shared.Models.Face> faces)
|
||||
public List<(Shared.Models.Face, FileHolder?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, ExifDirectory exifDirectory, List<Shared.Models.Face> faces)
|
||||
{
|
||||
List<(Shared.Models.Face, FileInfo?, string, bool Save)> results = [];
|
||||
List<(Shared.Models.Face, FileHolder?, string, bool Save)> results = [];
|
||||
bool save;
|
||||
FileInfo fileInfo;
|
||||
FileHolder fileHolder;
|
||||
string deterministicHashCodeKey;
|
||||
string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize)];
|
||||
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
|
||||
@ -351,42 +371,78 @@ public class D_Face : IFaceD
|
||||
}
|
||||
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||
fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.FilePath.ExtensionLowered}{_FileNameExtension}"));
|
||||
fileHolder = FileHolder.Get(fileInfo);
|
||||
if (!directoryExists)
|
||||
save = true;
|
||||
else if (_OverrideForFaceImages)
|
||||
save = true;
|
||||
else if (!fileInfo.Exists)
|
||||
else if (!fileHolder.Exists)
|
||||
save = true;
|
||||
else if (_CheckDFaceAndUpWriteDates && dateTimes.Count > 0 && dateTimes.Max() > fileInfo.LastWriteTime)
|
||||
save = true;
|
||||
results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.FilePath.ExtensionLowered}{_HiddenFileNameExtension}"), save));
|
||||
results.Add(new(face, fileHolder, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.FilePath.ExtensionLowered}{_HiddenFileNameExtension}"), save));
|
||||
}
|
||||
if (results.Any(l => l.Save))
|
||||
{
|
||||
if (!directoryExists)
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
string? maker = Metadata.Models.Stateless.Methods.IMetadata.GetMaker(exifDirectory);
|
||||
string? model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(exifDirectory);
|
||||
MetadataExtractor.GeoLocation? geoLocation = Metadata.Models.Stateless.Methods.IMetadata.GeoLocation(exifDirectory);
|
||||
SaveFaces(mappingFromItem.ResizedFileHolder, geoLocation, maker, model, results);
|
||||
SaveFaces(mappingFromItem.ResizedFileHolder, exifDirectory, results);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
#pragma warning disable CA1416
|
||||
|
||||
void IFaceD.ReSaveFace(ExifDirectory exifDirectory, LocationContainer locationContainer, Shared.Models.Face face)
|
||||
private static (string?, string?) Get(string? json)
|
||||
{
|
||||
FileInfo fileInfo = new(locationContainer.FilePath.FullName);
|
||||
string? model;
|
||||
string? maker;
|
||||
FaceFile? faceFile = json is null ? null : JsonSerializer.Deserialize(json, FaceFileGenerationContext.Default.FaceFile);
|
||||
if (faceFile is null || faceFile.Location is null)
|
||||
(maker, model) = (null, null);
|
||||
else
|
||||
(maker, model) = (faceFile.Maker, faceFile.Model);
|
||||
return (maker, model);
|
||||
}
|
||||
|
||||
void IFaceD.ReSaveFace(ExifDirectory exifDirectory, FilePath filePath, Shared.Models.Face face, bool mappedFile)
|
||||
{
|
||||
FileInfo fileInfo = new(filePath.FullName);
|
||||
if (fileInfo.Exists)
|
||||
{
|
||||
string? json;
|
||||
short type = 2;
|
||||
string checkFile = $"{locationContainer.FilePath.FullName}.exif";
|
||||
int artist = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagArtist;
|
||||
string? maker = Metadata.Models.Stateless.Methods.IMetadata.GetMaker(exifDirectory);
|
||||
string? model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(exifDirectory);
|
||||
MetadataExtractor.GeoLocation? geoLocation = Metadata.Models.Stateless.Methods.IMetadata.GeoLocation(exifDirectory);
|
||||
FaceFile faceFile = new(face.DateTime, geoLocation?.ToDmsString(), face.FaceParts, face.Location, maker, model, face.OutputResolution);
|
||||
string? model;
|
||||
string? maker;
|
||||
string checkFile = $"{filePath.FullName}.exif";
|
||||
const int artist = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagArtist;
|
||||
// const int author = MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagWinAuthor; // 40093
|
||||
if (mappedFile)
|
||||
{
|
||||
json = IMetadata.GetOutputResolution(exifDirectory);
|
||||
if (json is not null && json.Contains(nameof(DateTime)))
|
||||
return;
|
||||
(maker, model) = Get(json);
|
||||
}
|
||||
else
|
||||
{
|
||||
maker = IMetadata.GetMaker(exifDirectory);
|
||||
model = IMetadata.GetModel(exifDirectory);
|
||||
ExifDirectory? faceExifDirectory = IMetadata.GetExifDirectory(filePath);
|
||||
json = IMetadata.GetOutputResolution(faceExifDirectory);
|
||||
if (json is not null && json.Contains(nameof(DateTime)))
|
||||
return;
|
||||
}
|
||||
MetadataExtractor.GeoLocation? geoLocation = IMetadata.GeoLocation(exifDirectory);
|
||||
FaceFile faceFile = new(face.Mapping?.MappingFromLocation?.AreaPermyriad,
|
||||
face.Mapping?.MappingFromLocation?.ConfidencePercent,
|
||||
face.DateTime,
|
||||
geoLocation?.ToDmsString(),
|
||||
face.FaceParts,
|
||||
face.Location,
|
||||
maker,
|
||||
model,
|
||||
face.OutputResolution);
|
||||
string faceFileJson = JsonSerializer.Serialize(faceFile, FaceFileGenerationContext.Default.FaceFile);
|
||||
ConstructorInfo? constructorInfo = typeof(PropertyItem).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null, [], null) ?? throw new Exception();
|
||||
PropertyItem? propertyItem = Property.Models.Stateless.IProperty.GetPropertyItem(constructorInfo, artist, type, faceFileJson);
|
||||
|
Reference in New Issue
Block a user