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