Je haalt alle records uit je db op (id & filename is voldoende) en steekt deze in een array, met als key filename en als value je id
Je loopt via de directory functies je bestanden af, voor een IMG bestand doe je dit:
Zit het in db (via isset op $array[$filename])?
Zo ja, haal via de nodige functies dat specifiek record uit je mysql-gegevens arrays via unset.
Zo nee, maak via de nodige functies een thumbnail aan en voeg alle nodige details toe aan db.
Na de loop blijft er in je mysql-gegevens array enkel nog de data over van afbeeldingen die verwijderd zijn en die records (waarvan je normaal het id hebt) kan je nu gaan verwijderen

.
Hopelijk hielp het een beetje, dit is imho nl. de makkelijkste oplossing, enige bottleneck is de hoeveelheid db interactie, maar ik denk dat deze hier minimaal is.
Bovenstaand vb werkt ook niet, stel jij removet 3 files en voegt 3 toe, dan gaat het aantal imgs in map gelijk blijven en dus geen inconsistenties vertonen met de mysql COUNT gegevens.
edit: het is het beste bij deze code om je afbeeldingen in 1 map (of enkele specifieke mappen, dat is niet veel extra werk) op te slaan en je thumbnails ergens anders, thumbnails zijn ook afbeeldingen en dan zou je thumbs zitten toevoegen en thumbs van thumbs creëren, wat je niet wilt he

.