This was adapted from a php script to do the same by Mike Zriel (http://www.zriel.com/lamp/54-crop-and-rescale-images-function-using-gd-library)

bool CompareImages::cropImageAndRescale (Image image) {
    gdImagePtr imageOld, imageNew;
    Split splt;
    FILE *sourceFd;
    vector<string> elements = splt.split(image.sourceImage,'.');
    
    string ext = elements.back();
	if (ext == "jpg" || ext == "jpeg") {
            sourceFd = fopen(image.sourceImage.c_str(),"r");
		imageOld = gdImageCreateFromJpeg( sourceFd );
	} else if (ext == "gif") {
		imageOld = gdImageCreateFromGif( sourceFd );
	} else if (ext == "png") {
		imageOld = gdImageCreateFromPng( sourceFd );
	} else {
		return false;
	}
	int widthOld = gdImageSX(imageOld);
	int heightOld = gdImageSY(imageOld);
	imageNew = gdImageCreateTrueColor(image.outputWidth, image.outputHeight);
        image.print();
        gdImageCopyResized(imageNew, imageOld, 0, 0, image.posX, image.posY, image.outputWidth, image.outputHeight,  image.cropWidth, image.cropHeight);
        FILE *out = fopen(image.targetImage.c_str(), "wb");
        gdImagePng(imageNew, out);
        fclose(out);
        fclose(sourceFd);
        gdImageDestroy(imageNew);
        gdImageDestroy(imageOld);
}
#ifndef IMAGE_H
#define IMAGE_H
#include <string>

using namespace std;


class Image
{
    public:
        string sourceImage;
        string targetImage;
        int cropWidth;
        int cropHeight;
        int posX;
        int posY;
        int outputWidth;
        int outputHeight;
        void set( string m_sourceImage, string m_targetImage, int m_cropWidth, int m_cropHeight, int m_posX, int m_posY, int m_outputWidth, int m_outputHeight) 
        {
        sourceImage=m_sourceImage;
        targetImage=m_targetImage;
        cropWidth=m_cropWidth;
        cropHeight=m_cropHeight;
        posX=m_posX;
        posY=m_posY;
        outputWidth=m_outputWidth;
        outputHeight=m_outputHeight;
        }
        void print ()
        {
            cout <<"cropWidth "<< cropWidth<<endl;
            cout <<"cropHeight "<< cropHeight  <<endl;
            cout <<"posX "<< posX<<endl;
            cout <<"posY "<< posY<<endl;
            cout <<"outputWidth "<< outputWidth<<endl;
            cout <<"outputHeight "<< outputHeight<<endl;
        }
};
#endif

Examples

    Image im;
//void set( string m_sourceImage, string m_targetImage, int m_cropWidth, int m_cropHeight, int m_posX, int m_posY, int m_outputWidth, int m_outputHeight) 
    im.set("/run/shm/goal.jpg","/home/pi/smgoal.jpg",450,130,0,70,450,333);
    compareImages.cropImageAndRescale(im);
    im.set("/run/shm/goal.jpg","/home/pi/xsmgoal.jpg",450,330,0,0,225,166);
    compareImages.cropImageAndRescale(im);