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);
}
}