/* subsamp.cpp
*
* subsamp extracts a subimage of the file in and outputs it to file out.
* extraction begins at line fprec, pixel fpsam, and continues over nrec
* records, nsam pixels taking every inc pixel per line from every inc
* line.
*
* parameters
* in workfile from which the image is to be extracted
* out workfile to which the extracted image is to be written
* fpsam pixel of the first line at which sampling is to begin
* fprec line of the input file at which sampling is to begin
* nsam number of pixels per line to be spanned
* nrec number of records to be spanned in the sampling
* inc interval at which sampling is to take place
*
*******/
#include <stdio.h>
#include "image.h"
void subsamp(IMAGE *in, IMAGE *out, int fpsam, int fprec,int incpix, int inclin);
int main(int argc, char *argv[])
{
int i, fpix, flin, incpix, inclin, hlen, vlen;
IMAGE *in, *out;
char *infile, *outfile;
if (argc<2) {
printf("Usage: subsamp infile outfile [first] [inc]\n");
printf("Subsample input image\n");
return -1;
}
infile = argv[1];
printf("input image: %s\n",infile);
in = open_image(infile);
if (!in) {
printf("error opening input file\n");
return -1;
}
printf("image size: %d x %d\n",in->hlen,in->vlen);
fpix = flin = 5;
incpix = inclin = 3;
if (argc>3) {
sscanf(argv[3],"%d",&fpix);
flin = fpix;
}
if (argc>4) {
sscanf(argv[4],"%d",&incpix);
inclin = incpix;
}
if (argc>5) sscanf(argv[5],"%d",&flin);
if (argc>6) sscanf(argv[6],"%d",&inclin);
/* check parameters */
if (fpix<0) fpix=0;
if (flin<0) flin=0;
if (incpix<1) incpix=1;
if (inclin<1) inclin=1;
printf("starting sample: (%d, %d)\n",fpix,flin);
printf("sample spacing: %d x %d\n",incpix,inclin);
/* set output image size */
hlen = vlen = 0;
for (i=fpix; i<in->hlen; i += incpix) hlen++;
for (i=flin; i<in->vlen; i += inclin) vlen++;
outfile = argv[2];
printf("output file: %s\n",outfile);
out = make_image(outfile,hlen,vlen,in->type);
if (!out) {
printf("error creating output file\n");
return -1;
}
subsamp(in,out,fpix,flin,incpix,inclin);
printf("image size: %d x %d\n",out->hlen,out->vlen);
return 0;
}
void subsamp(IMAGE *in, IMAGE *out, int fpsam, int fprec,int incpix, int inclin)
{
int i, k, kin, line, lino;
pixel *buf, *ibuf;
ibuf = make_buffer(in);
buf = make_buffer(out);
for (i=0;i<out->hlen;i++) buf[i]=0;
/* Skip to the first desired record.
* Extract pixels from input file at the specified increment,
* creating one output line at a time. Output that line, then skip
* lines on input file for the given increment. Continue until
* all lines have been output to new file.
*/
lino=0;
line=fprec;
while ((lino<out->vlen) && (line<in->vlen)) {
get_line(in,line,ibuf,in->type);
k=0;
kin=fpsam;
while ((k<out->hlen)&&(kin<in->hlen)) {
kin = fpsam + k*incpix;
buf[k]=ibuf[kin];
k++;
kin += incpix;
}
put_line(out,lino,buf,in->type);
lino++;
line +=inclin;
}
for (i=0;i<out->hlen;i++) buf[i]=0;
while (lino<out->vlen) put_line(out,lino++,buf,in->type);
free_buffer(buf);
free_buffer(ibuf);
}