resize-gd

annotate resize-gd.c @ 2:8e71b54b6e1e

made separate functions for calcsize and usage; pictures are not enlarged by default
author meillo@marmaro.de
date Sat, 14 Jun 2008 10:15:07 +0200
parents 7a8f72b27dc3
children 35a50e57b6f5
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@2 26 struct size {
meillo@2 27 int w;
meillo@2 28 int h;
meillo@2 29 };
meillo@0 30
meillo@2 31
meillo@2 32 void
meillo@2 33 usage() {
meillo@2 34 puts("\
meillo@2 35 usage: resize-gd <size> <imagefiles> [...]\n\
meillo@2 36 (keeps aspect ratio, does not enlarge images)\n\
meillo@2 37 resize-gd <width>x<height> <imagefiles> [...]\n\
meillo@2 38 (resizes to that size, enlarges if needed)\n\
meillo@2 39 ");
meillo@2 40 }
meillo@2 41
meillo@2 42
meillo@2 43 struct size
meillo@2 44 calcsize(struct size opt, struct size img, int enlarge) {
meillo@2 45 struct size result;
meillo@2 46
meillo@2 47 if (opt.h <= 0) {
meillo@2 48 /* keep aspect ratio */
meillo@2 49 if (!enlarge && opt.w > img.w && opt.w > img.h) {
meillo@2 50 opt.w = (img.w > img.h) ? img.w : img.h;
meillo@2 51 }
meillo@2 52 if (img.w > img.h) {
meillo@2 53 result.w = opt.w;
meillo@2 54 result.h = opt.w * (1.0 * img.h / img.w);
meillo@2 55 } else {
meillo@2 56 result.h = opt.w;
meillo@2 57 result.w = opt.w * (1.0 * img.w / img.h);
meillo@2 58 }
meillo@2 59 } else {
meillo@2 60 result = opt;
meillo@2 61 }
meillo@2 62 return result;
meillo@2 63 }
meillo@2 64
meillo@2 65
meillo@2 66 int
meillo@2 67 validsize(char* sp) {
meillo@2 68 while (isdigit(*sp)) {
meillo@2 69 sp++;
meillo@2 70 }
meillo@2 71 if (*sp == 'x' && isdigit(*(sp+1))) {
meillo@2 72 sp++;
meillo@2 73 while (isdigit(*sp)) {
meillo@2 74 sp++;
meillo@2 75 }
meillo@2 76 }
meillo@2 77 if (*sp != '\0') {
meillo@2 78 return 0;
meillo@2 79 }
meillo@2 80 return 1;
meillo@2 81 }
meillo@2 82
meillo@2 83
meillo@2 84 int
meillo@2 85 main(int argc, char* argv[]) {
meillo@0 86 int i;
meillo@0 87 int w, h;
meillo@1 88 int width, height;
meillo@0 89 int x, y;
meillo@0 90 int type;
meillo@0 91 gdImagePtr im_in;
meillo@0 92 gdImagePtr im_out;
meillo@0 93 FILE* in;
meillo@0 94 FILE* out;
meillo@2 95 char* c;
meillo@2 96 struct size sizeopt, sizeimg, sizedest;
meillo@0 97
meillo@0 98 if (argc < 3) {
meillo@2 99 usage();
meillo@0 100 exit(1);
meillo@0 101 }
meillo@0 102
meillo@2 103 if (!validsize(argv[1])) {
meillo@1 104 fprintf(stderr, "Invalid form of size. Has to be <size> or <width>x<height>.\n");
meillo@2 105 usage();
meillo@1 106 exit(3);
meillo@1 107 }
meillo@1 108
meillo@2 109 /* parse width and height */
meillo@2 110 sizeopt.w = atoi(argv[1]);
meillo@2 111 c = strstr(argv[1], "x");
meillo@2 112 if (c && c[1] != '\0') {
meillo@2 113 sizeopt.h = atoi(c + 1);
meillo@1 114 } else {
meillo@2 115 sizeopt.h = -1; /* keep aspect ratio */
meillo@1 116 }
meillo@1 117
meillo@0 118
meillo@0 119 /* process images */
meillo@0 120 for (i = 2; i < argc; i++) {
meillo@0 121 printf("processing file '%s'\n", argv[i]);
meillo@0 122
meillo@1 123 if (strcmp(argv[i]+strlen(argv[i])-4, ".png") == 0) {
meillo@0 124 type = Png;
meillo@1 125 } else if (strcmp(argv[i]+strlen(argv[i])-4, ".jpg") == 0) {
meillo@0 126 type = Jpg;
meillo@0 127 } else {
meillo@1 128 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
meillo@1 129 continue;
meillo@0 130 }
meillo@1 131 /* load image */
meillo@1 132 in = fopen(argv[i], "rb");
meillo@0 133
meillo@0 134 if (type == Png) {
meillo@0 135 im_in = gdImageCreateFromPng(in);
meillo@0 136 } else if (type == Jpg) {
meillo@0 137 im_in = gdImageCreateFromJpeg(in);
meillo@0 138 }
meillo@1 139 /*
meillo@1 140 if ((im_in = gdImageCreateFromPng(in)) != NULL) {
meillo@1 141 type = Png;
meillo@1 142 } else if ((im_in = gdImageCreateFromJpeg(in)) != NULL) {
meillo@1 143 type = Jpg;
meillo@1 144 } else {
meillo@1 145 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
meillo@1 146 continue;
meillo@1 147 }
meillo@1 148 */
meillo@1 149
meillo@0 150 fclose(in);
meillo@0 151
meillo@2 152 /* calculate target size */
meillo@2 153 sizeimg.w = im_in->sx;
meillo@2 154 sizeimg.h = im_in->sy;
meillo@2 155 sizedest = calcsize(sizeopt, sizeimg, 0);
meillo@1 156
meillo@1 157 /* copy-resize the image */
meillo@2 158 im_out = gdImageCreateTrueColor(sizedest.w, sizedest.h);
meillo@0 159 gdImageCopyResampled(im_out, im_in, 0, 0, 0, 0, im_out->sx, im_out->sy, im_in->sx, im_in->sy);
meillo@0 160
meillo@1 161 /* write image */
meillo@0 162 out = fopen(argv[i], "wb");
meillo@0 163 if (type == Png) {
meillo@0 164 gdImagePng(im_out, out);
meillo@0 165 } else if (type == Jpg) {
meillo@0 166 gdImageJpeg(im_out, out, -1);
meillo@0 167 }
meillo@0 168 fclose(out);
meillo@0 169
meillo@0 170 gdImageDestroy(im_in);
meillo@0 171 gdImageDestroy(im_out);
meillo@0 172 }
meillo@0 173
meillo@0 174 return 0;
meillo@0 175 }