Mercurial > 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 |
---|---|
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 } |