/*** dupl.cpp * * increase image size by pixel replication. * ***/ #include <stdio.h> #include <stdlib.h> #include "image.h" int dupl(IMAGE *in, IMAGE *out, int hmag, int vmag); int main(int argc, char *argv[]) { int magx, magy; IMAGE *in, *out; char *infile,*outfile; if (argc<3) { printf("usage: dupl infile outfile [magx] [magy]\n"); printf("Expand image using pixel replication.\n"); return -1; } infile=argv[1]; outfile=argv[2]; if (argc>3) sscanf(argv[3],"%d",&magx); else magx = 1; if (argc>4) sscanf(argv[4],"%d",&magy); else magy=magx; in = open_image(infile); if (!in) return -1; printf("input image: %s\n",infile); printf("image size: %d x %d\n",in->hlen,in->vlen); printf("pixel replication factors: %d x %d\n\n",magx,magy); if (magx<1 || magy < 1) { printf("illegal replication factors\n"); return -1; } if (magx == 1 && magy == 1) { printf("no replication required\n"); return -1; } out = make_image(outfile,in->hlen*magx,in->vlen*magy,in->type); printf("output image: %s\n",outfile); if (!out) { printf("error creating output file\n"); return -1; } dupl(in,out,magx,magy); printf("image size: %d x %d\n",out->hlen,out->vlen); return 0; } int dupl(IMAGE *in, IMAGE *out, int hmag, int vmag) { pixel *ibuf, *obuf; pixel *bp, *cp; int i, j, k, line; ibuf = make_buffer(in); obuf = make_buffer(out); if ((hmag<=0)||(vmag<=0)) return -1; // not allowed if (hmag*in->hlen > out->hlen) return -2; // image will not fit if (vmag*in->vlen > out->vlen) return -3; for (i=line=0; i<in->vlen; i++) { get_line(in,i,ibuf,in->type); bp = ibuf; cp = obuf; for (j=0; j<in->hlen; j++, bp++) { for (k=0; k<hmag; k++) *cp++ = *bp; } for (j=0; j<vmag; j++) put_line(out,line++,obuf,in->type); } free_buffer(obuf); free_buffer(ibuf); return 0; }