/* samplerect.cpp - downsample check image based on corner coordinates */ static char usage[] = "usage: %s coords.txt in.png out.png width\n"; #include #include #include #include "imageLib.h" #define RATIO24 1.525 #define RATIO140 1.402 void interp(int x0, int y0, int x1, int y1, int i, int max, int *xx, int *yy) { int dx = (x1 - x0) * i / max; int dy = (y1 - y0) * i / max; *xx = x0 + dx; *yy = y0 + dy; } int main(int argc, char **argv) { int verbose = 1; if (argc != 5) { fprintf(stderr, usage, argv[0]); exit(1); } int optind = 1; char *coordname = argv[optind++]; char *imname = argv[optind++]; char *outname = argv[optind++]; int imw = atoi(argv[optind++]); try { FILE *fp = fopen(coordname, "r"); int x[4], y[4]; for (int k = 0, *px = x, *py = y; k < 4; k++, px++, py++) fscanf(fp, "%d %d", px, py); fclose(fp); int w1 = x[1] - x[0]; int w2 = x[3] - x[2]; int h1 = y[2] - y[0]; int h2 = y[3] - y[1]; float r11 = (float)w1/h1; float r12 = (float)w1/h2; float r21 = (float)w2/h1; float r22 = (float)w2/h2; float r = (r11 + r12 + r21 + r22) / 4.0; printf("aspect ratios:\n %.3f\n %.3f\n %.3f\n %.3f\navg\n %.3f \n", r11, r12, r21, r22, r); float ratio; if (fabs(r - RATIO24) < fabs(r - RATIO140)) { printf("24 checkers: using ratio %g ", RATIO24); ratio = RATIO24; } else { printf("140 checkers: using ratio %g ", RATIO140); ratio = RATIO140; } int imh = (int)(imw / ratio); printf("image size: %d x %d\n", imw, imh); CByteImage im; ReadImageVerb(im, imname, verbose); CShape shim = im.Shape(); int nB = shim.nBands; CShape sh(imw, imh, nB); CByteImage outim(sh); int xx0, yy0, xx1, yy1, xx, yy; for (int oy = 0; oy < imh; oy++) { interp(x[0], y[0], x[2], y[2], oy, imh-1, &xx0, &yy0); interp(x[1], y[1], x[3], y[3], oy, imh-1, &xx1, &yy1); for (int ox = 0; ox < imw; ox++) { interp(xx0, yy0, xx1, yy1, ox, imw-1, &xx, &yy); for (int b = 0; b < nB; b++) outim.Pixel(ox, oy, b) = im.Pixel(xx, yy, b); } } WriteImageVerb(outim, outname, verbose); } catch (CError &err) { fprintf(stderr, err.message); fprintf(stderr, "\n"); exit(1); } return 0; }