Сравните изображение с массивом изображений
У меня есть изображение, расположенное в
C:\ImageOne.png
И у меня есть, скажем, 20 изображений в каталоге
C:\Images
Как я могу сравнить ImageOne.png со всеми этими изображениями?
Пример:
Представьте, что я получил одно изображение reCaptcha, сохраненное как C:\ImageOne.png
И в папке, расположенной в C:\Images, у меня есть другие изображения reCaptcha.
Затем мне нужен код, который может найти идентичное изображение внутри C:\Images
Текущий код:
public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
{
MemoryStream ms = new MemoryStream();
firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
String firstBitmap = Convert.ToBase64String(ms.ToArray());
ms.Position = 0;
secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
String secondBitmap = Convert.ToBase64String(ms.ToArray());
if (firstBitmap.Equals(secondBitmap))
{
return true;
}
else
{
return false;
}
}
Bitmap img2 = new Bitmap(@"C:\ImageOne");
private void CheckCaptcha()
{
foreach (string s in Directory.GetFiles(@"C:\Images"))
{
Bitmap img1 = new Bitmap(s);
if (ImageCompareString(img1, img2) == true)
{
Logging("Identical");
}
else
{
Logging("Not Identical");
}
img1.Dispose();
}
}
1 ответ
Решение
Может быть, это поможет:
Bitmap img2 = new Bitmap(@"C:\ImageOne.png");
ImageConverter converter = new ImageConverter();
byte[] img2Bytes = (byte[])converter.ConvertTo(img2, typeof(byte[]));
foreach (string s in Directory.GetFiles(@"C:\Images"))
{
Bitmap img1 = new Bitmap(s);
byte[] img1Bytes = (byte[])converter.ConvertTo(img1, typeof(byte[]));
if (CompareImages(img1Bytes,img2Bytes))
{
Logging("Identical");
}
else
{
Logging("Not Identical");
}
img1.Dispose();
}
public bool CompareImages(byte[] b1, byte[] b2)
{
EqualityComparer<byte> comparer = EqualityComparer<byte>.Default;
if (b1.Length == b2.Length)
{
for (int i = 0; i < b1.Length; i++)
{
if (!comparer.Equals(b1[i], b2[i])) return false;
}
} else { return false; }
return true;
}