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