using System.IO; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using static System.Net.WebRequestMethods; using Image = SixLabors.ImageSharp.Image; using Size = SixLabors.ImageSharp.Size; namespace Masuit.Tools.Media; /// /// 使用ImageSharp进行图像变换 /// public class ImageSharpTransformer : IImageTransformer { public byte[] TransformImage(Stream stream, int width, int height) { using var image = Image.Load(stream); return TransformImage(image, width, height); } public byte[] TransformImage(Image image, int width, int height) { image.Mutate(x => x.Resize(new ResizeOptions() { Size = new Size { Width = width, Height = height }, Mode = ResizeMode.Stretch, Sampler = new BicubicResampler() }).Grayscale()); image.DangerousTryGetSinglePixelMemory(out var pixelSpan); var pixelArray = pixelSpan.ToArray(); var pixelCount = width * height; var bytes = new byte[pixelCount]; for (var i = 0; i < pixelCount; i++) { bytes[i] = pixelArray[i].B; } return bytes; } } public static class ImageHashExt { /// /// 使用平均值算法计算图像的64位哈希 /// /// 读取到的图片流 /// 64位hash值 public static ulong AverageHash64(this Image image) { var hasher = new ImageHasher(); return hasher.AverageHash64(image); } /// /// 使用中值算法计算给定图像的64位哈希 /// 将图像转换为8x8灰度图像,从中查找中值像素值,然后在结果哈希中将值大于中值的所有像素标记为1。与基于平均值的实现相比,更能抵抗非线性图像编辑。 /// /// 读取到的图片流 /// 64位hash值 public static ulong MedianHash64(this Image image) { var hasher = new ImageHasher(); return hasher.MedianHash64(image); } /// /// 使用中值算法计算给定图像的256位哈希 /// 将图像转换为16x16的灰度图像,从中查找中值像素值,然后在结果哈希中将值大于中值的所有像素标记为1。与基于平均值的实现相比,更能抵抗非线性图像编辑。 /// /// 读取到的图片流 /// 256位hash值,生成一个4长度的数组返回 public static ulong[] MedianHash256(this Image image) { var hasher = new ImageHasher(); return hasher.MedianHash256(image); } /// /// 使用差分哈希算法计算图像的64位哈希。 /// /// /// 读取到的图片流 /// 64位hash值 public static ulong DifferenceHash64(this Image image) { var hasher = new ImageHasher(); return hasher.DifferenceHash64(image); } /// /// 使用差分哈希算法计算图像的64位哈希。 /// /// /// 读取到的图片流 /// 256位hash值 public static ulong[] DifferenceHash256(this Image image) { var hasher = new ImageHasher(); return hasher.DifferenceHash256(image); } /// /// 使用DCT算法计算图像的64位哈希 /// /// /// 读取到的图片流 /// 64位hash值 public static ulong DctHash(this Image image) { var hasher = new ImageHasher(); return hasher.DctHash(image); } /// /// 使用汉明距离比较两幅图像的哈希值。结果1表示图像完全相同,而结果0表示图像完全不同。 /// /// 图像1 /// 图像2 /// 相似度范围:[0,1] public static float Compare(this Image image1, Image image2) { var hasher = new ImageHasher(); var hash1 = hasher.DifferenceHash256(image1); var hash2 = hasher.DifferenceHash256(image2); return ImageHasher.Compare(hash1, hash2); } /// /// 使用汉明距离比较两幅图像的哈希值。结果1表示图像完全相同,而结果0表示图像完全不同。 /// /// 图像1的hash /// 图像2的路径 /// 相似度范围:[0,1] public static float Compare(this Image image1, string image2path) { var hasher = new ImageHasher(); var hash1 = hasher.DifferenceHash256(image1); var hash2 = hasher.DifferenceHash256(image2path); return ImageHasher.Compare(hash1, hash2); } }