我正在用C#编写一个工具来查找重复的图像.目前我创建了文件的MD5校验和并进行比较.
不幸的是我的图像可以
什么是解决这个问题的最佳方法?
fub*_*ubo 80
这是一个256位图像哈希的简单方法(MD5有128位)
List<bool>
- 这是哈希值 代码:
public static List<bool> GetHash(Bitmap bmpSource)
{
List<bool> lResult = new List<bool>();
//create new image with 16x16 pixel
Bitmap bmpMin = new Bitmap(bmpSource, new Size(16, 16));
for (int j = 0; j < bmpMin.Height; j++)
{
for (int i = 0; i < bmpMin.Width; i++)
{
//reduce colors to true / false
lResult.Add(bmpMin.GetPixel(i, j).GetBrightness() < 0.5f);
}
}
return lResult;
}
Run Code Online (Sandbox Code Playgroud)
我知道,GetPixel
不是那么快,但在16x16像素的图像上它不应该是瓶颈.
码:
List<bool> iHash1 = GetHash(new Bitmap(@"C:\mykoala1.jpg"));
List<bool> iHash2 = GetHash(new Bitmap(@"C:\mykoala2.jpg"));
//determine the number of equal pixel (x of 256)
int equalElements = iHash1.Zip(iHash2, (i, j) => i == j).Count(eq => eq);
Run Code Online (Sandbox Code Playgroud)
所以这段代码能够找到相同的图像:
i
和j
更新/改进:
使用这种方法一段时间后,我注意到可以做的一些改进
GetPixel
更多的表现0.5f
在明暗之间的差异 - 使用所有256像素的明显中值亮度.否则,假设暗/亮图像是相同的,并且它能够检测具有改变的亮度的图像.bool[]
或者List<bool>
你需要存储很多哈希需要节省内存,使用a Bitarray
因为布尔值没有存储在一个位,它需要一个字节!