Rispetto al costo di caricare/ridimensionare/salvare un'immagine sono tutte distinzioni completamente irrilevanti. Volendo puoi metterti da parte l'operazione da fare in una std::function, ma di nuovo, non c'è nessun guadagno a farlo.

Piuttosto, c'è un errore grosso sia dal punto di vista della correttezza che da quello delle prestazioni: stai usando una QPixmap. Questo è male perché:
- le QPixmap possono essere usate solo dal thread della GUI, mentre tu le stai usando da un worker thread;
- le QPixmap sono bitmap ottimizzate per il disegno rapido su schermo, non per la manipolazione; in pratica, possono essere implementate come un wrapper attorno alle bitmap della libreria grafica sottostante (su X11 fino a Qt4 erano dei reference a bitmap X11; sotto Qt5, il backend Direct2D le usa come puntatori a texture tenute in memoria video) in modo che siano velocissime da disegnare a schermo, ma accedere ai loro pixel può essere più complicato.

Per questi motivi, in generale per effettuare manipolazioni di immagini usa le QImage, non le QPixmap.