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