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@0
|
26
|
meillo@0
|
27 int main(int argc, char* argv[]) {
|
meillo@0
|
28 int i;
|
meillo@0
|
29 int w, h;
|
meillo@1
|
30 int width, height;
|
meillo@0
|
31 int x, y;
|
meillo@0
|
32 int type;
|
meillo@0
|
33 gdImagePtr im_in;
|
meillo@0
|
34 gdImagePtr im_out;
|
meillo@0
|
35 FILE* in;
|
meillo@0
|
36 FILE* out;
|
meillo@1
|
37 char* sep;
|
meillo@0
|
38
|
meillo@0
|
39 if (argc < 3) {
|
meillo@1
|
40 puts("usage: resize-gd <width>x<height> <imagefiles>\n\
|
meillo@1
|
41 resize-gd <size> <imagefiles> (keeps aspect ratio)\n");
|
meillo@0
|
42 exit(1);
|
meillo@0
|
43 }
|
meillo@0
|
44
|
meillo@0
|
45 /* parse width and height */
|
meillo@1
|
46 sep = argv[1];
|
meillo@1
|
47 while (isdigit(*sep)) {
|
meillo@1
|
48 sep++;
|
meillo@1
|
49 }
|
meillo@1
|
50 if (*sep == 'x' && isdigit(*(sep+1))) {
|
meillo@1
|
51 sep++;
|
meillo@1
|
52 while (isdigit(*sep)) {
|
meillo@1
|
53 sep++;
|
meillo@1
|
54 }
|
meillo@1
|
55 }
|
meillo@1
|
56 if (*sep != '\0') {
|
meillo@1
|
57 fprintf(stderr, "Invalid form of size. Has to be <size> or <width>x<height>.\n");
|
meillo@1
|
58 exit(3);
|
meillo@1
|
59 }
|
meillo@1
|
60
|
meillo@1
|
61 width = atoi(argv[1]);
|
meillo@1
|
62 sep = strstr(argv[1], "x");
|
meillo@1
|
63 if (sep && sep[1] != '\0') {
|
meillo@1
|
64 height = atoi(sep + 1);
|
meillo@1
|
65 } else {
|
meillo@1
|
66 height = -1; /* keep aspect ratio */
|
meillo@1
|
67 }
|
meillo@1
|
68
|
meillo@0
|
69
|
meillo@0
|
70 /* process images */
|
meillo@0
|
71 for (i = 2; i < argc; i++) {
|
meillo@0
|
72 printf("processing file '%s'\n", argv[i]);
|
meillo@0
|
73
|
meillo@1
|
74 if (strcmp(argv[i]+strlen(argv[i])-4, ".png") == 0) {
|
meillo@0
|
75 type = Png;
|
meillo@1
|
76 } else if (strcmp(argv[i]+strlen(argv[i])-4, ".jpg") == 0) {
|
meillo@0
|
77 type = Jpg;
|
meillo@0
|
78 } else {
|
meillo@1
|
79 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
|
meillo@1
|
80 continue;
|
meillo@0
|
81 }
|
meillo@1
|
82 /* load image */
|
meillo@1
|
83 in = fopen(argv[i], "rb");
|
meillo@0
|
84
|
meillo@0
|
85 if (type == Png) {
|
meillo@0
|
86 im_in = gdImageCreateFromPng(in);
|
meillo@0
|
87 } else if (type == Jpg) {
|
meillo@0
|
88 im_in = gdImageCreateFromJpeg(in);
|
meillo@0
|
89 }
|
meillo@1
|
90 /*
|
meillo@1
|
91 if ((im_in = gdImageCreateFromPng(in)) != NULL) {
|
meillo@1
|
92 type = Png;
|
meillo@1
|
93 } else if ((im_in = gdImageCreateFromJpeg(in)) != NULL) {
|
meillo@1
|
94 type = Jpg;
|
meillo@1
|
95 } else {
|
meillo@1
|
96 fprintf(stderr, "'%s' has unknown filetype. Filename must end with (lowercase) '.png' or '.jpg'.\n", argv[i]);
|
meillo@1
|
97 continue;
|
meillo@1
|
98 }
|
meillo@1
|
99 */
|
meillo@1
|
100
|
meillo@0
|
101 fclose(in);
|
meillo@0
|
102
|
meillo@1
|
103 /* for keeping aspect ratio */
|
meillo@1
|
104 if (height <= 0) {
|
meillo@1
|
105 if (im_in->sx > im_in->sy) {
|
meillo@1
|
106 w = width;
|
meillo@1
|
107 h = width * (1.0 * im_in->sy / im_in->sx);
|
meillo@1
|
108 } else {
|
meillo@1
|
109 h = width;
|
meillo@1
|
110 w = width * (1.0 * im_in->sx / im_in->sy);
|
meillo@1
|
111 }
|
meillo@1
|
112 } else {
|
meillo@1
|
113 w = width;
|
meillo@1
|
114 h = height;
|
meillo@1
|
115 }
|
meillo@1
|
116
|
meillo@1
|
117 /* copy-resize the image */
|
meillo@0
|
118 im_out = gdImageCreateTrueColor(w, h);
|
meillo@0
|
119 gdImageCopyResampled(im_out, im_in, 0, 0, 0, 0, im_out->sx, im_out->sy, im_in->sx, im_in->sy);
|
meillo@0
|
120
|
meillo@1
|
121 /* write image */
|
meillo@0
|
122 out = fopen(argv[i], "wb");
|
meillo@0
|
123 if (type == Png) {
|
meillo@0
|
124 gdImagePng(im_out, out);
|
meillo@0
|
125 } else if (type == Jpg) {
|
meillo@0
|
126 gdImageJpeg(im_out, out, -1);
|
meillo@0
|
127 }
|
meillo@0
|
128 fclose(out);
|
meillo@0
|
129
|
meillo@0
|
130 gdImageDestroy(im_in);
|
meillo@0
|
131 gdImageDestroy(im_out);
|
meillo@0
|
132 }
|
meillo@0
|
133
|
meillo@0
|
134 return 0;
|
meillo@0
|
135 }
|