meillo@1: /* meillo@1: * compile with: gcc -lgd -lpng -lz -ljpeg -lm resize-gd.c meillo@1: * build-depends: libgd2-noxpm-dev | libgd2-dev meillo@1: * depends: libgd2-noxpm | libgd2-xpm meillo@1: * meillo@1: * meillo@1: * meillo@1: * http://www.libgd.org/ImageCreation meillo@1: * http://cpan.uwinnipeg.ca/htdocs/Image-Resize/Image/Resize.pm.html meillo@1: * http://netpbm.sourceforge.net/ meillo@1: * meillo@1: */ meillo@0: meillo@0: #include meillo@0: #include /* for atoi() */ meillo@0: #include meillo@1: #include meillo@0: #include "gd.h" /* Bring in the gd library functions */ meillo@0: meillo@0: meillo@0: enum { meillo@0: Png, meillo@0: Jpg, meillo@0: }; meillo@0: meillo@0: meillo@0: int main(int argc, char* argv[]) { meillo@0: int i; meillo@0: int w, h; meillo@1: int width, height; meillo@0: int x, y; meillo@0: int type; meillo@0: gdImagePtr im_in; meillo@0: gdImagePtr im_out; meillo@0: FILE* in; meillo@0: FILE* out; meillo@1: char* sep; meillo@0: meillo@0: if (argc < 3) { meillo@1: puts("usage: resize-gd x \n\ meillo@1: resize-gd (keeps aspect ratio)\n"); meillo@0: exit(1); meillo@0: } meillo@0: meillo@0: /* parse width and height */ meillo@1: sep = argv[1]; meillo@1: while (isdigit(*sep)) { meillo@1: sep++; meillo@1: } meillo@1: if (*sep == 'x' && isdigit(*(sep+1))) { meillo@1: sep++; meillo@1: while (isdigit(*sep)) { meillo@1: sep++; meillo@1: } meillo@1: } meillo@1: if (*sep != '\0') { meillo@1: fprintf(stderr, "Invalid form of size. Has to be or x.\n"); meillo@1: exit(3); meillo@1: } meillo@1: meillo@1: width = atoi(argv[1]); meillo@1: sep = strstr(argv[1], "x"); meillo@1: if (sep && sep[1] != '\0') { meillo@1: height = atoi(sep + 1); meillo@1: } else { meillo@1: height = -1; /* keep aspect ratio */ meillo@1: } meillo@1: meillo@0: meillo@0: /* process images */ meillo@0: for (i = 2; i < argc; i++) { meillo@0: printf("processing file '%s'\n", argv[i]); meillo@0: meillo@1: if (strcmp(argv[i]+strlen(argv[i])-4, ".png") == 0) { meillo@0: type = Png; meillo@1: } else if (strcmp(argv[i]+strlen(argv[i])-4, ".jpg") == 0) { meillo@0: type = Jpg; meillo@0: } else { meillo@1: fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]); meillo@1: continue; meillo@0: } meillo@1: /* load image */ meillo@1: in = fopen(argv[i], "rb"); meillo@0: meillo@0: if (type == Png) { meillo@0: im_in = gdImageCreateFromPng(in); meillo@0: } else if (type == Jpg) { meillo@0: im_in = gdImageCreateFromJpeg(in); meillo@0: } meillo@1: /* meillo@1: if ((im_in = gdImageCreateFromPng(in)) != NULL) { meillo@1: type = Png; meillo@1: } else if ((im_in = gdImageCreateFromJpeg(in)) != NULL) { meillo@1: type = Jpg; meillo@1: } else { meillo@1: fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]); meillo@1: continue; meillo@1: } meillo@1: */ meillo@1: meillo@0: fclose(in); meillo@0: meillo@1: /* for keeping aspect ratio */ meillo@1: if (height <= 0) { meillo@1: if (im_in->sx > im_in->sy) { meillo@1: w = width; meillo@1: h = width * (1.0 * im_in->sy / im_in->sx); meillo@1: } else { meillo@1: h = width; meillo@1: w = width * (1.0 * im_in->sx / im_in->sy); meillo@1: } meillo@1: } else { meillo@1: w = width; meillo@1: h = height; meillo@1: } meillo@1: meillo@1: /* copy-resize the image */ meillo@0: im_out = gdImageCreateTrueColor(w, h); meillo@0: gdImageCopyResampled(im_out, im_in, 0, 0, 0, 0, im_out->sx, im_out->sy, im_in->sx, im_in->sy); meillo@0: meillo@1: /* write image */ meillo@0: out = fopen(argv[i], "wb"); meillo@0: if (type == Png) { meillo@0: gdImagePng(im_out, out); meillo@0: } else if (type == Jpg) { meillo@0: gdImageJpeg(im_out, out, -1); meillo@0: } meillo@0: fclose(out); meillo@0: meillo@0: gdImageDestroy(im_in); meillo@0: gdImageDestroy(im_out); meillo@0: } meillo@0: meillo@0: return 0; meillo@0: }