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, new string[] { "{}", "()" }, maxValue: 102); 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(FileHolder fileHolder) { string? result; string directory = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(fileHolder.Name, length: 2); result = !int.TryParse(directory, out int directoryIndex) ? null : Path.Combine(_JsonGroups["{}"][directoryIndex], $"{fileHolder.Name}.csv"); return result; } string IBlurHasher.EncodeAndSave(FileHolder fileHolder) { string? file; string result; int actualByte; string extension = ".png"; IBlurHasher blurHasher = this; file = blurHasher.GetFile(fileHolder); if (file is null) throw new NullReferenceException(nameof(file)); #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); string directory = Shared.Models.Stateless.Methods.IDirectory.GetDirectory(joined, length: 2); if (int.TryParse(directory, out int directoryIndex)) { file = Path.Combine(_JsonGroups["()"][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; } }