Sort and Delete duplicate image files
You don't need to store the whole file contents, compute hash instead. Also converting each image to JPEG is not necessary, use image.RawFormat, it would be a bit faster.
using (SHA256 sha = SHA256.Create())
using (var ms = new MemoryStream((int)new FileInfo(file).Length))
{
    image.Save(ms, image.RawFormat);
    ms.Position = 0;
    data = Convert.ToBase64String(sha.ComputeHash(ms));
}

2nd option
if (!uniqueData.Contains(data))
{
    uniqueData.Add(data);
    // ...
}

Can be simplified to
if (uniqueData.Add(data))
{
    // ...
}

Also twice getting the directoriry files can be once
string[] files = Directory.GetFiles(imageFolderPath);
int fileCount = files.Length;

foreach (var file in files)
{
    // ...
}

And finally this one
if (!Directory.Exists(yearDirectory))
{
    Directory.CreateDirectory(yearDirectory);
}

Directory.CreateDirectory creates directory if it not exists, otherwise it does nothing. You can remove Exists check.
Directory.CreateDirectory(yearDirectory);