resize-gd

annotate resize-gd.c @ 1:7a8f72b27dc3

added keep aspect ratio; validated size
author meillo@localhost.localdomain
date Sat, 14 Jun 2008 09:08:05 +0200
parents 8c94239b3b3f
children 8e71b54b6e1e
rev   line source
meillo@1 1 /*
meillo@1 2 * compile with: gcc -lgd -lpng -lz -ljpeg -lm resize-gd.c
meillo@1 3 * build-depends: libgd2-noxpm-dev | libgd2-dev
meillo@1 4 * depends: libgd2-noxpm | libgd2-xpm
meillo@1 5 *
meillo@1 6 *
meillo@1 7 *
meillo@1 8 * http://www.libgd.org/ImageCreation
meillo@1 9 * http://cpan.uwinnipeg.ca/htdocs/Image-Resize/Image/Resize.pm.html
meillo@1 10 * http://netpbm.sourceforge.net/
meillo@1 11 *
meillo@1 12 */
meillo@0 13
meillo@0 14 #include <stdio.h>
meillo@0 15 #include <stdlib.h> /* for atoi() */
meillo@0 16 #include <string.h>
meillo@1 17 #include <ctype.h>
meillo@0 18 #include "gd.h" /* Bring in the gd library functions */
meillo@0 19
meillo@0 20
meillo@0 21 enum {
meillo@0 22 Png,
meillo@0 23 Jpg,
meillo@0 24 };
meillo@0 25
meillo@0 26
meillo@0 27 int main(int argc, char* argv[]) {
meillo@0 28 int i;
meillo@0 29 int w, h;
meillo@1 30 int width, height;
meillo@0 31 int x, y;
meillo@0 32 int type;
meillo@0 33 gdImagePtr im_in;
meillo@0 34 gdImagePtr im_out;
meillo@0 35 FILE* in;
meillo@0 36 FILE* out;
meillo@1 37 char* sep;
meillo@0 38
meillo@0 39 if (argc < 3) {
meillo@1 40 puts("usage: resize-gd <width>x<height> <imagefiles>\n\
meillo@1 41 resize-gd <size> <imagefiles> (keeps aspect ratio)\n");
meillo@0 42 exit(1);
meillo@0 43 }
meillo@0 44
meillo@0 45 /* parse width and height */
meillo@1 46 sep = argv[1];
meillo@1 47 while (isdigit(*sep)) {
meillo@1 48 sep++;
meillo@1 49 }
meillo@1 50 if (*sep == 'x' && isdigit(*(sep+1))) {
meillo@1 51 sep++;
meillo@1 52 while (isdigit(*sep)) {
meillo@1 53 sep++;
meillo@1 54 }
meillo@1 55 }
meillo@1 56 if (*sep != '\0') {
meillo@1 57 fprintf(stderr, "Invalid form of size. Has to be <size> or <width>x<height>.\n");
meillo@1 58 exit(3);
meillo@1 59 }
meillo@1 60
meillo@1 61 width = atoi(argv[1]);
meillo@1 62 sep = strstr(argv[1], "x");
meillo@1 63 if (sep && sep[1] != '\0') {
meillo@1 64 height = atoi(sep + 1);
meillo@1 65 } else {
meillo@1 66 height = -1; /* keep aspect ratio */
meillo@1 67 }
meillo@1 68
meillo@0 69
meillo@0 70 /* process images */
meillo@0 71 for (i = 2; i < argc; i++) {
meillo@0 72 printf("processing file '%s'\n", argv[i]);
meillo@0 73
meillo@1 74 if (strcmp(argv[i]+strlen(argv[i])-4, ".png") == 0) {
meillo@0 75 type = Png;
meillo@1 76 } else if (strcmp(argv[i]+strlen(argv[i])-4, ".jpg") == 0) {
meillo@0 77 type = Jpg;
meillo@0 78 } else {
meillo@1 79 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
meillo@1 80 continue;
meillo@0 81 }
meillo@1 82 /* load image */
meillo@1 83 in = fopen(argv[i], "rb");
meillo@0 84
meillo@0 85 if (type == Png) {
meillo@0 86 im_in = gdImageCreateFromPng(in);
meillo@0 87 } else if (type == Jpg) {
meillo@0 88 im_in = gdImageCreateFromJpeg(in);
meillo@0 89 }
meillo@1 90 /*
meillo@1 91 if ((im_in = gdImageCreateFromPng(in)) != NULL) {
meillo@1 92 type = Png;
meillo@1 93 } else if ((im_in = gdImageCreateFromJpeg(in)) != NULL) {
meillo@1 94 type = Jpg;
meillo@1 95 } else {
meillo@1 96 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
meillo@1 97 continue;
meillo@1 98 }
meillo@1 99 */
meillo@1 100
meillo@0 101 fclose(in);
meillo@0 102
meillo@1 103 /* for keeping aspect ratio */
meillo@1 104 if (height <= 0) {
meillo@1 105 if (im_in->sx > im_in->sy) {
meillo@1 106 w = width;
meillo@1 107 h = width * (1.0 * im_in->sy / im_in->sx);
meillo@1 108 } else {
meillo@1 109 h = width;
meillo@1 110 w = width * (1.0 * im_in->sx / im_in->sy);
meillo@1 111 }
meillo@1 112 } else {
meillo@1 113 w = width;
meillo@1 114 h = height;
meillo@1 115 }
meillo@1 116
meillo@1 117 /* copy-resize the image */
meillo@0 118 im_out = gdImageCreateTrueColor(w, h);
meillo@0 119 gdImageCopyResampled(im_out, im_in, 0, 0, 0, 0, im_out->sx, im_out->sy, im_in->sx, im_in->sy);
meillo@0 120
meillo@1 121 /* write image */
meillo@0 122 out = fopen(argv[i], "wb");
meillo@0 123 if (type == Png) {
meillo@0 124 gdImagePng(im_out, out);
meillo@0 125 } else if (type == Jpg) {
meillo@0 126 gdImageJpeg(im_out, out, -1);
meillo@0 127 }
meillo@0 128 fclose(out);
meillo@0 129
meillo@0 130 gdImageDestroy(im_in);
meillo@0 131 gdImageDestroy(im_out);
meillo@0 132 }
meillo@0 133
meillo@0 134 return 0;
meillo@0 135 }