using System.Collections.ObjectModel; using System.Drawing; using System.Text; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; using View_by_Distance.Shared.Models.Properties; namespace View_by_Distance.BlurHash.Models; public class C2_BlurHasher : IBlurHasher { private readonly IPropertyConfiguration _PropertyConfiguration; private readonly Dictionary> _FileGroups; public C2_BlurHasher(IPropertyConfiguration propertyConfiguration) { _FileGroups = []; _PropertyConfiguration = propertyConfiguration; } public void Update(string resultsFullGroupDirectory) { _FileGroups.Clear(); ReadOnlyDictionary> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, resultsFullGroupDirectory, [_PropertyConfiguration.ResultContent, _PropertyConfiguration.ResultSingleton]); foreach (KeyValuePair> keyValuePair in keyValuePairs) _FileGroups.Add(keyValuePair.Key, keyValuePair.Value); } string IBlurHasher.Encode(FileHolder fileHolder) { string result; #pragma warning disable CA1416 Image image = Image.FromFile(fileHolder.FullName); (int componentsX, int componentsY) = image.Width < image.Height ? (4, 3) : (3, 4); ReadOnlySpan blurHash = System.Drawing.BlurHash.BlurHasher.Encode(image, componentsX, componentsY); image.Dispose(); #pragma warning restore CA1416 result = blurHash.ToString(); return result; } string IBlurHasher.GetFile(FilePath filePath) { string result; if (_FileGroups.Count == 0) throw new Exception("Call Update first!"); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath); result = Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{filePath.Name}.csv"); return result; } string IBlurHasher.EncodeAndSave(FilePath filePath, FileHolder fileHolder) { string result; if (_FileGroups.Count == 0) throw new Exception("Call Update first!"); int actualByte; string extension = ".png"; IBlurHasher blurHasher = this; string file = blurHasher.GetFile(filePath); #pragma warning disable CA1416 Image image = Image.FromFile(fileHolder.FullName); int outputWidth = (int)(image.Width * .25); int outputHeight = (int)(image.Height * .25); (int componentsX, int componentsY) = image.Width < image.Height ? (4, 3) : (3, 4); ReadOnlySpan blurHash = System.Drawing.BlurHash.BlurHasher.Encode(image, componentsX, componentsY); using Image actualImage = System.Drawing.BlurHash.BlurHasher.Decode(blurHash, outputWidth, outputHeight); result = blurHash.ToString(); byte[] blurHashBytes = Encoding.UTF8.GetBytes(result); string joined = string.Join(string.Empty, blurHashBytes.Select(l => l.ToString("000"))); string fileNameWithoutExtension = $"{componentsX}x{componentsY}-{outputWidth}x{outputHeight}-{joined}"; string contents = string.Concat(result, Environment.NewLine, fileNameWithoutExtension, Environment.NewLine, extension); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(file, contents, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath); file = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], $"{fileNameWithoutExtension}{extension}"); if (!File.Exists(file)) { try { using FileStream fileStream = new(file, FileMode.CreateNew); actualImage.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png); _ = fileStream.Seek(0, SeekOrigin.Begin); actualByte = fileStream.ReadByte(); while (actualByte > -1) actualByte = fileStream.ReadByte(); } catch (Exception) { } } image.Dispose(); #pragma warning restore CA1416 result = blurHash.ToString(); return result; } }