/* * rotate image using one of three sampling techniques */ Image* ip_rotate (Image* src, double theta, int x, int y, int samplingMode, int gaussianFilterSize, double gaussianSigma) { Image* tempImage = new Image(src->getWidth(), src->getHeight()); if(samplingMode == 0){ for (int i = 0; i < src->getWidth(); ++i) { for (int j = 0; j < src->getHeight(); ++j) { Pixel resampledPixel = ip_resample_nearest(src, i, j); tempImage->setPixel_((((i-x)*(cos(theta))-((j-y)*sin(theta)))), (((j-y)*(cos(theta))+ ((i-x)*(sin(theta))))), resampledPixel); } } } else if(samplingMode == 1){ for (int i = 0; i < src->getWidth(); ++i) { for (int j = 0; j < src->getHeight(); ++j) { Pixel resampledPixel = ip_resample_bilinear(src, i, j); tempImage->setPixel_((((i-x)*(cos(theta))-((j-y)*sin(theta)))), (((j-y)*(cos(theta))+ ((i-x)*(sin(theta))))), resampledPixel); } } } else if (samplingMode == 2){ //go die } return tempImage; }
/* * scale image */ Image* ip_scale (Image* src, double xFac, double yFac) { Image* dest = new Image(src->getWidth()*xFac, src->getHeight()*yFac); for (int i = 0; i < dest->getWidth(); ++i) { for (int j = 0; j < dest->getHeight(); ++j) { double xp = i*1./xFac; double yp = j*1./yFac; if (xp >= src->getWidth() || xp < 0 || yp >= src->getHeight() || yp < 0) { continue; } Pixel p = ip_resample_bilinear(src, xp, yp); dest->setPixel(i, j, p); } } return dest; }
/* * rotate image */ Image* ip_rotate (Image* src, double theta) { Image* dest = new Image(src->getWidth(), src->getHeight()); double x = src->getWidth()/2; double y = src->getHeight()/2; double ctheta = cos(-theta); double stheta = sin(-theta); Pixel white = Pixel(1, 1, 1); dest->fillImage(white); for (int i = 0; i < dest->getWidth(); ++i) { for (int j = 0; j < dest->getHeight(); ++j) { double xp = x + (i-x)*ctheta - (j-y)*stheta; double yp = y + (i-x)*stheta + (j-y)*ctheta; Pixel p = ip_resample_bilinear(src, xp, yp); dest->setPixel(i, j, p); } } return dest; }