83 lines
3.9 KiB
C#

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 IReadOnlyDictionary<string, string[]> _FileGroups;
public C2_BlurHasher(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory)
{
_PropertyConfiguration = propertyConfiguration;
_FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, resultsFullGroupDirectory, new string[] { propertyConfiguration.ResultContent, propertyConfiguration.ResultSingleton });
}
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<char> 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;
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.Name);
result = Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{fileHolder.Name}.csv");
return result;
}
string IBlurHasher.EncodeAndSave(FileHolder fileHolder)
{
string result;
int actualByte;
string extension = ".png";
IBlurHasher blurHasher = this;
string file = blurHasher.GetFile(fileHolder);
#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<char> 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.ResultAllInOneSubdirectoryLength, joined);
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;
}
}