using System.Drawing; using System.Text; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.BlurHash.Models; public class BlurHasher : IBlurHasher { string IBlurHasher.Encode(Image image) => #pragma warning disable CA1416 image.Width < image.Height ? Encode(image, 4, 3) : Encode(image, 3, 4); #pragma warning restore CA1416 string IBlurHasher.EncodeAndSave(Image image, string directory) => #pragma warning disable CA1416 image.Width < image.Height ? EncodeAndSave(image, 4, 3, 300, 190, directory) : EncodeAndSave(image, 3, 4, 300, 190, directory); #pragma warning restore CA1416 string IBlurHasher.Encode(Image image, int x, int y) => Encode(image, x, y); string IBlurHasher.EncodeAndSave(Image image, int x, int y, string directory) => EncodeAndSave(image, x, y, 300, 190, directory); internal static string Encode(Image image, int x, int y) => System.Drawing.BlurHash.BlurHasher.Encode(image, x, y); public string EncodeAndSave(Image image, int x, int y, int width, int height, string directory) { string result; int actualByte; result = System.Drawing.BlurHash.BlurHasher.Encode(image, x, y); byte[] blurHashBytes = Encoding.UTF8.GetBytes(result); using Bitmap actualImage = (Bitmap)System.Drawing.BlurHash.BlurHasher.Decode(result, width, height); string joined = string.Join(string.Empty, blurHashBytes.Select(l => l.ToString("000"))); string fileName = Path.Combine(directory, $"{x}x{y}-{width}x{height}-{joined}.png"); if (!File.Exists(fileName)) { using FileStream fileStream = new(fileName, FileMode.CreateNew); #pragma warning disable CA1416 actualImage.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png); #pragma warning restore CA1416 _ = fileStream.Seek(0, SeekOrigin.Begin); actualByte = fileStream.ReadByte(); while (actualByte > -1) actualByte = fileStream.ReadByte(); } return result; } }