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);