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