using System.Drawing; using System.Text; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.BlurHash.Models; public class C2_BlurHasher : IBlurHasher { private readonly IReadOnlyDictionary _JsonGroups; public C2_BlurHasher(string resultAllInOne, string? resultsFullGroupDirectory) => _JsonGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(resultAllInOne, resultsFullGroupDirectory); 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.EncodeAndSave(FileHolder fileHolder) { string file; string result; int actualByte; char directory; int directoryIndex; string extension = ".png"; #pragma warning disable CA1416 Image image = Image.FromFile(fileHolder.FullName); (int componentsX, int componentsY, int outputWidth, int outputHeight) = image.Width < image.Height ? (4, 3, 300, 190) : (3, 4, 300, 190); 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}"; directory = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(fileHolder.Name); directoryIndex = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(directory); file = Path.Combine(_JsonGroups["{}"][directoryIndex], $"{fileHolder.Name}.csv"); 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); directory = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(joined); directoryIndex = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(directory); file = Path.Combine(_JsonGroups["()"][directoryIndex], $"{fileNameWithoutExtension}{extension}"); if (!File.Exists(file)) { 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(); } image.Dispose(); #pragma warning restore CA1416 result = blurHash.ToString(); return result; } }