57 lines
1.9 KiB
C#
57 lines
1.9 KiB
C#
using SkiaSharp;
|
|
using View_by_Distance.Shared.Models.Methods;
|
|
|
|
namespace View_by_Distance.ThumbHash.Models;
|
|
|
|
public class C2_ThumbHasher : IThumbHasher
|
|
{
|
|
|
|
private static SKBitmap GetBitmap(string path)
|
|
{
|
|
SKBitmap result;
|
|
using SKBitmap skBitmap = SKBitmap.Decode(path);
|
|
result = skBitmap.Copy(SKColorType.Rgba8888);
|
|
return result;
|
|
}
|
|
|
|
private static byte[] Encode(SKBitmap skBitmap) =>
|
|
ThumbHash.RgbaToThumbHash(skBitmap.Width, skBitmap.Height, skBitmap.GetPixelSpan());
|
|
|
|
private static byte[] Encode(string path)
|
|
{
|
|
byte[] results;
|
|
using SKBitmap skBitmap = GetBitmap(path);
|
|
results = Encode(skBitmap);
|
|
return results;
|
|
}
|
|
|
|
byte[] IThumbHasher.Encode(string path) =>
|
|
Encode(path);
|
|
|
|
private static MemoryStream GetMemoryStream(byte[] thumbHashBytes, int width, int height)
|
|
{
|
|
MemoryStream result = new();
|
|
(int w, int h) = (width / 2, height / 2);
|
|
using SKManagedWStream skManagedWStream = new(result);
|
|
byte[] bytes = ThumbHash.ThumbHashToRgba(thumbHashBytes, w, h);
|
|
SKImageInfo skImageInfo = new(w, h, SKColorType.Rgba8888, SKAlphaType.Unpremul);
|
|
using SKImage skImage = SKImage.FromPixelCopy(skImageInfo, bytes);
|
|
using SKData sdData = skImage.Encode(SKEncodedImageFormat.Png, 100);
|
|
sdData.SaveTo(result);
|
|
return result;
|
|
}
|
|
|
|
MemoryStream IThumbHasher.GetMemoryStream(byte[] thumbHashBytes, int width, int height) =>
|
|
GetMemoryStream(thumbHashBytes, width, height);
|
|
|
|
(byte[], MemoryStream) IThumbHasher.EncodeAndSave(string path, int width, int height)
|
|
{
|
|
byte[] results;
|
|
MemoryStream result;
|
|
using SKBitmap skBitmap = GetBitmap(path);
|
|
results = Encode(skBitmap);
|
|
result = GetMemoryStream(results, width, height);
|
|
return (results, result);
|
|
}
|
|
|
|
} |