A vu de nez ton algo ressemble à du "nearest neighbor" (plus proche voisin), l'algo le plus basique que tu puisses trouver en matière de retaillage d'image. Sa qualité n'est franchement pas terrible, surtout avec des images de la taille que tu manipules.
Idéalement, tu devrais utiliser une bibliothèque de traitement d'image dédiée (genre: cairo, GDI+, SDL_gfx, GD, etc...). Si tu ne veux pas importer d'artillerie lourde, j'avais écrit un article sur le retaillage d'image par méthode linéaire (incomplet, mais l'algo est inclus):
http://en.literateprograms.org/Ima [...] ng_%28C%29
Coté performance et qualité, l'algo n'est pas trop mauvais, j'utilisais ça dans un visualisateur d'image cartographique (les images pouvaient faire jusqu'à 10000px), où tu pouvais zoomer jusqu'au format vignette avec très peu de latence. J'avais aussi implémenté le retaillage exponentiel mentionné à la fin, mais le code était vraiment moche.
L'algo décrit fonctionne uniquement avec des images en 8bps (bit per sample). Va falloir légèrement l'adapter pour traiter du 4bps.