2using System.Collections.Generic;
5using System.Threading.Tasks;
6using static System.Net.Mime.MediaTypeNames;
13 public static class DuplicatedImageFinder
15 private static List<DuplicatedImage> _duplicatedImages =
new List<DuplicatedImage>();
17 public static void AddHash(
string hash,
string pathToDuplicate)
19 if (_duplicatedImages.Any(img => img.Hash == hash))
22 _duplicatedImages.FirstOrDefault(img => img.Hash == hash).AddDuplicate(pathToDuplicate);
27 _duplicatedImages.Add(
new DuplicatedImage(hash, pathToDuplicate));
31 public static void SaveData(
string saveDataFilePath)
33 string json = JsonConvert.SerializeObject(_duplicatedImages);
34 File.WriteAllText(saveDataFilePath, json);
37 public static void LoadData(
string saveDataFilePath)
39 string json = File.ReadAllText(saveDataFilePath);
40 _duplicatedImages = JsonConvert.DeserializeObject<List<DuplicatedImage>>(json);
44 public static void OutputData(
string outputFilePath)
46 if(File.ReadLines(outputFilePath).First() ==
"No duplicates found.")
48 File.WriteAllText(outputFilePath,
"");
51 using (StreamWriter sw = File.AppendText(outputFilePath))
53 foreach (var img
in _duplicatedImages)
60 public static string DisplayData()
62 string displayOutput = String.Empty;
63 foreach (var img
in _duplicatedImages)
68 if (displayOutput == String.Empty)
70 displayOutput =
"No duplicates found.";
76 public static void FindOriginals(List<string> filePaths, List<string> hashesFound)
78 if (filePaths.Count == hashesFound.Count)
80 foreach(var img
in _duplicatedImages)
82 int i = hashesFound.IndexOf(img.Hash);
83 string ogPath = filePaths[i];
84 img.OriginalPath = ogPath;
89 Console.WriteLine(
"Note: Can't find original files as filePaths and hashesFound are different in length");
93 public static void VerifyDuplicates()
96 List<string> NotDuplicatePaths =
new List<string>();
98 for (
int i = 0; i < _duplicatedImages.Count; i++)
100 string ogPath = _duplicatedImages[i].OriginalPath;
101 Bitmap img1 =
new Bitmap(ogPath);
102 foreach (var duplicatedPath
in _duplicatedImages[i].DuplicateImages)
104 Bitmap img2 =
new Bitmap(duplicatedPath);
106 if (!AreImagesEqual(img1 , img2))
108 NotDuplicatePaths.Add(duplicatedPath);
114 if (NotDuplicatePaths.Count > 1)
116 DuplicatedImage temp =
new DuplicatedImage(_duplicatedImages[i].Hash);
117 temp.OriginalPath = NotDuplicatePaths[0];
118 NotDuplicatePaths.RemoveAt(0);
119 foreach (var path
in NotDuplicatePaths)
121 temp.AddDuplicate(path);
124 _duplicatedImages.Add(temp);
129 private static bool AreImagesEqual(Bitmap bmp1, Bitmap bmp2)
131 if (bmp1.Width != bmp2.Width || bmp1.Height != bmp2.Height)
134 for (
int y = 0; y < bmp1.Height; y++)
136 for (
int x = 0; x < bmp1.Width; x++)
138 if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y))