resize-gd

annotate resize-gd.c @ 5:8e2804fe30bc

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