OLD | NEW |
1 /* | 1 /* |
2 * cjpeg.c | 2 * cjpeg.c |
3 * | 3 * |
4 * Copyright (C) 1991-1998, Thomas G. Lane. | 4 * Copyright (C) 1991-1998, Thomas G. Lane. |
| 5 * Modified 2003-2008 by Guido Vollbeding. |
| 6 * Copyright (C) 2010, D. R. Commander. |
5 * This file is part of the Independent JPEG Group's software. | 7 * This file is part of the Independent JPEG Group's software. |
6 * For conditions of distribution and use, see the accompanying README file. | 8 * For conditions of distribution and use, see the accompanying README file. |
7 * | 9 * |
8 * This file contains a command-line user interface for the JPEG compressor. | 10 * This file contains a command-line user interface for the JPEG compressor. |
9 * It should work on any system with Unix- or MS-DOS-style command lines. | 11 * It should work on any system with Unix- or MS-DOS-style command lines. |
10 * | 12 * |
11 * Two different command line styles are permitted, depending on the | 13 * Two different command line styles are permitted, depending on the |
12 * compile-time switch TWO_FILE_COMMANDLINE: | 14 * compile-time switch TWO_FILE_COMMANDLINE: |
13 * cjpeg [options] inputfile outputfile | 15 * cjpeg [options] inputfile outputfile |
14 * cjpeg [options] [inputfile] | 16 * cjpeg [options] [inputfile] |
15 * In the second style, output is always to standard output, which you'd | 17 * In the second style, output is always to standard output, which you'd |
16 * normally redirect to a file or pipe to some other program. Input is | 18 * normally redirect to a file or pipe to some other program. Input is |
17 * either from a named file or from standard input (typically redirected). | 19 * either from a named file or from standard input (typically redirected). |
18 * The second style is convenient on Unix but is unhelpful on systems that | 20 * The second style is convenient on Unix but is unhelpful on systems that |
19 * don't support pipes. Also, you MUST use the first style if your system | 21 * don't support pipes. Also, you MUST use the first style if your system |
20 * doesn't do binary I/O to stdin/stdout. | 22 * doesn't do binary I/O to stdin/stdout. |
21 * To simplify script writing, the "-outfile" switch is provided. The syntax | 23 * To simplify script writing, the "-outfile" switch is provided. The syntax |
22 * cjpeg [options] -outfile outputfile inputfile | 24 * cjpeg [options] -outfile outputfile inputfile |
23 * works regardless of which command line style is used. | 25 * works regardless of which command line style is used. |
24 */ | 26 */ |
25 | 27 |
26 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ | 28 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ |
27 #include "jversion.h" /* for version message */ | 29 #include "jversion.h" /* for version message */ |
| 30 #include "config.h" |
28 | 31 |
29 #ifdef USE_CCOMMAND /* command-line reader for Macintosh */ | 32 #ifdef USE_CCOMMAND /* command-line reader for Macintosh */ |
30 #ifdef __MWERKS__ | 33 #ifdef __MWERKS__ |
31 #include <SIOUX.h> /* Metrowerks needs this */ | 34 #include <SIOUX.h> /* Metrowerks needs this */ |
32 #include <console.h> /* ... and this */ | 35 #include <console.h> /* ... and this */ |
33 #endif | 36 #endif |
34 #ifdef THINK_C | 37 #ifdef THINK_C |
35 #include <console.h> /* Think declares it here */ | 38 #include <console.h> /* Think declares it here */ |
36 #endif | 39 #endif |
37 #endif | 40 #endif |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 /* complain about bad command line */ | 145 /* complain about bad command line */ |
143 { | 146 { |
144 fprintf(stderr, "usage: %s [switches] ", progname); | 147 fprintf(stderr, "usage: %s [switches] ", progname); |
145 #ifdef TWO_FILE_COMMANDLINE | 148 #ifdef TWO_FILE_COMMANDLINE |
146 fprintf(stderr, "inputfile outputfile\n"); | 149 fprintf(stderr, "inputfile outputfile\n"); |
147 #else | 150 #else |
148 fprintf(stderr, "[inputfile]\n"); | 151 fprintf(stderr, "[inputfile]\n"); |
149 #endif | 152 #endif |
150 | 153 |
151 fprintf(stderr, "Switches (names may be abbreviated):\n"); | 154 fprintf(stderr, "Switches (names may be abbreviated):\n"); |
152 fprintf(stderr, " -quality N Compression quality (0..100; 5-95 is useful
range)\n"); | 155 fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is use
ful range)\n"); |
153 fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); | 156 fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); |
154 #ifdef ENTROPY_OPT_SUPPORTED | 157 #ifdef ENTROPY_OPT_SUPPORTED |
155 fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but sl
ow compression)\n"); | 158 fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but sl
ow compression)\n"); |
156 #endif | 159 #endif |
157 #ifdef C_PROGRESSIVE_SUPPORTED | 160 #ifdef C_PROGRESSIVE_SUPPORTED |
158 fprintf(stderr, " -progressive Create progressive JPEG file\n"); | 161 fprintf(stderr, " -progressive Create progressive JPEG file\n"); |
159 #endif | 162 #endif |
160 #ifdef TARGA_SUPPORTED | 163 #ifdef TARGA_SUPPORTED |
161 fprintf(stderr, " -targa Input file is Targa format (usually not need
ed)\n"); | 164 fprintf(stderr, " -targa Input file is Targa format (usually not need
ed)\n"); |
162 #endif | 165 #endif |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 * Returns argv[] index of first file-name argument (== argc if none). | 205 * Returns argv[] index of first file-name argument (== argc if none). |
203 * Any file names with indexes <= last_file_arg_seen are ignored; | 206 * Any file names with indexes <= last_file_arg_seen are ignored; |
204 * they have presumably been processed in a previous iteration. | 207 * they have presumably been processed in a previous iteration. |
205 * (Pass 0 for last_file_arg_seen on the first or only iteration.) | 208 * (Pass 0 for last_file_arg_seen on the first or only iteration.) |
206 * for_real is FALSE on the first (dummy) pass; we may skip any expensive | 209 * for_real is FALSE on the first (dummy) pass; we may skip any expensive |
207 * processing. | 210 * processing. |
208 */ | 211 */ |
209 { | 212 { |
210 int argn; | 213 int argn; |
211 char * arg; | 214 char * arg; |
212 int quality; /* -quality parameter */ | |
213 int q_scale_factor; /* scaling percentage for -qtables */ | |
214 boolean force_baseline; | 215 boolean force_baseline; |
215 boolean simple_progressive; | 216 boolean simple_progressive; |
| 217 char * qualityarg = NULL; /* saves -quality parm if any */ |
216 char * qtablefile = NULL; /* saves -qtables filename if any */ | 218 char * qtablefile = NULL; /* saves -qtables filename if any */ |
217 char * qslotsarg = NULL; /* saves -qslots parm if any */ | 219 char * qslotsarg = NULL; /* saves -qslots parm if any */ |
218 char * samplearg = NULL; /* saves -sample parm if any */ | 220 char * samplearg = NULL; /* saves -sample parm if any */ |
219 char * scansarg = NULL; /* saves -scans parm if any */ | 221 char * scansarg = NULL; /* saves -scans parm if any */ |
220 | 222 |
221 /* Set up default JPEG parameters. */ | 223 /* Set up default JPEG parameters. */ |
222 /* Note that default -quality level need not, and does not, | 224 |
223 * match the default scaling for an explicit -qtables argument. | |
224 */ | |
225 quality = 75;»» » /* default -quality value */ | |
226 q_scale_factor = 100;»» /* default to no scaling for -qtables */ | |
227 force_baseline = FALSE; /* by default, allow 16-bit quantizers */ | 225 force_baseline = FALSE; /* by default, allow 16-bit quantizers */ |
228 simple_progressive = FALSE; | 226 simple_progressive = FALSE; |
229 is_targa = FALSE; | 227 is_targa = FALSE; |
230 outfilename = NULL; | 228 outfilename = NULL; |
231 cinfo->err->trace_level = 0; | 229 cinfo->err->trace_level = 0; |
232 | 230 |
233 /* Scan command line options, adjust parameters */ | 231 /* Scan command line options, adjust parameters */ |
234 | 232 |
235 for (argn = 1; argn < argc; argn++) { | 233 for (argn = 1; argn < argc; argn++) { |
236 arg = argv[argn]; | 234 arg = argv[argn]; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 cinfo->dct_method = JDCT_FLOAT; | 268 cinfo->dct_method = JDCT_FLOAT; |
271 } else | 269 } else |
272 usage(); | 270 usage(); |
273 | 271 |
274 } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { | 272 } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { |
275 /* Enable debug printouts. */ | 273 /* Enable debug printouts. */ |
276 /* On first -d, print version identification */ | 274 /* On first -d, print version identification */ |
277 static boolean printed_version = FALSE; | 275 static boolean printed_version = FALSE; |
278 | 276 |
279 if (! printed_version) { | 277 if (! printed_version) { |
280 » fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n", | 278 » fprintf(stderr, "%s version %s (build %s)\n", |
| 279 » » PACKAGE_NAME, VERSION, BUILD); |
| 280 » fprintf(stderr, "%s\n\n", LJTCOPYRIGHT); |
| 281 » fprintf(stderr, "Based on Independent JPEG Group's libjpeg, version %s\n
%s\n\n", |
281 JVERSION, JCOPYRIGHT); | 282 JVERSION, JCOPYRIGHT); |
282 printed_version = TRUE; | 283 printed_version = TRUE; |
283 } | 284 } |
284 cinfo->err->trace_level++; | 285 cinfo->err->trace_level++; |
285 | 286 |
286 } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { | 287 } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { |
287 /* Force a monochrome JPEG file to be generated. */ | 288 /* Force a monochrome JPEG file to be generated. */ |
288 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); | 289 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); |
289 | 290 |
290 } else if (keymatch(arg, "maxmemory", 3)) { | 291 } else if (keymatch(arg, "maxmemory", 3)) { |
(...skipping 30 matching lines...) Expand all Loading... |
321 #ifdef C_PROGRESSIVE_SUPPORTED | 322 #ifdef C_PROGRESSIVE_SUPPORTED |
322 simple_progressive = TRUE; | 323 simple_progressive = TRUE; |
323 /* We must postpone execution until num_components is known. */ | 324 /* We must postpone execution until num_components is known. */ |
324 #else | 325 #else |
325 fprintf(stderr, "%s: sorry, progressive output was not compiled\n", | 326 fprintf(stderr, "%s: sorry, progressive output was not compiled\n", |
326 progname); | 327 progname); |
327 exit(EXIT_FAILURE); | 328 exit(EXIT_FAILURE); |
328 #endif | 329 #endif |
329 | 330 |
330 } else if (keymatch(arg, "quality", 1)) { | 331 } else if (keymatch(arg, "quality", 1)) { |
331 /* Quality factor (quantization table scaling factor). */ | 332 /* Quality ratings (quantization table scaling factors). */ |
332 if (++argn >= argc) /* advance to next argument */ | 333 if (++argn >= argc) /* advance to next argument */ |
333 usage(); | 334 usage(); |
334 if (sscanf(argv[argn], "%d", &quality) != 1) | 335 qualityarg = argv[argn]; |
335 » usage(); | |
336 /* Change scale factor in case -qtables is present. */ | |
337 q_scale_factor = jpeg_quality_scaling(quality); | |
338 | 336 |
339 } else if (keymatch(arg, "qslots", 2)) { | 337 } else if (keymatch(arg, "qslots", 2)) { |
340 /* Quantization table slot numbers. */ | 338 /* Quantization table slot numbers. */ |
341 if (++argn >= argc) /* advance to next argument */ | 339 if (++argn >= argc) /* advance to next argument */ |
342 usage(); | 340 usage(); |
343 qslotsarg = argv[argn]; | 341 qslotsarg = argv[argn]; |
344 /* Must delay setting qslots until after we have processed any | 342 /* Must delay setting qslots until after we have processed any |
345 * colorspace-determining switches, since jpeg_set_colorspace sets | 343 * colorspace-determining switches, since jpeg_set_colorspace sets |
346 * default quant table numbers. | 344 * default quant table numbers. |
347 */ | 345 */ |
(...skipping 27 matching lines...) Expand all Loading... |
375 } else if (keymatch(arg, "sample", 2)) { | 373 } else if (keymatch(arg, "sample", 2)) { |
376 /* Set sampling factors. */ | 374 /* Set sampling factors. */ |
377 if (++argn >= argc) /* advance to next argument */ | 375 if (++argn >= argc) /* advance to next argument */ |
378 usage(); | 376 usage(); |
379 samplearg = argv[argn]; | 377 samplearg = argv[argn]; |
380 /* Must delay setting sample factors until after we have processed any | 378 /* Must delay setting sample factors until after we have processed any |
381 * colorspace-determining switches, since jpeg_set_colorspace sets | 379 * colorspace-determining switches, since jpeg_set_colorspace sets |
382 * default sampling factors. | 380 * default sampling factors. |
383 */ | 381 */ |
384 | 382 |
385 } else if (keymatch(arg, "scans", 2)) { | 383 } else if (keymatch(arg, "scans", 4)) { |
386 /* Set scan script. */ | 384 /* Set scan script. */ |
387 #ifdef C_MULTISCAN_FILES_SUPPORTED | 385 #ifdef C_MULTISCAN_FILES_SUPPORTED |
388 if (++argn >= argc) /* advance to next argument */ | 386 if (++argn >= argc) /* advance to next argument */ |
389 usage(); | 387 usage(); |
390 scansarg = argv[argn]; | 388 scansarg = argv[argn]; |
391 /* We must postpone reading the file in case -progressive appears. */ | 389 /* We must postpone reading the file in case -progressive appears. */ |
392 #else | 390 #else |
393 fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", | 391 fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", |
394 progname); | 392 progname); |
395 exit(EXIT_FAILURE); | 393 exit(EXIT_FAILURE); |
(...skipping 19 matching lines...) Expand all Loading... |
415 usage(); /* bogus switch */ | 413 usage(); /* bogus switch */ |
416 } | 414 } |
417 } | 415 } |
418 | 416 |
419 /* Post-switch-scanning cleanup */ | 417 /* Post-switch-scanning cleanup */ |
420 | 418 |
421 if (for_real) { | 419 if (for_real) { |
422 | 420 |
423 /* Set quantization tables for selected quality. */ | 421 /* Set quantization tables for selected quality. */ |
424 /* Some or all may be overridden if -qtables is present. */ | 422 /* Some or all may be overridden if -qtables is present. */ |
425 jpeg_set_quality(cinfo, quality, force_baseline); | 423 if (qualityarg != NULL)» /* process -quality if it was present */ |
| 424 if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) |
| 425 » usage(); |
426 | 426 |
427 if (qtablefile != NULL) /* process -qtables if it was present */ | 427 if (qtablefile != NULL) /* process -qtables if it was present */ |
428 if (! read_quant_tables(cinfo, qtablefile, | 428 if (! read_quant_tables(cinfo, qtablefile, force_baseline)) |
429 » » » q_scale_factor, force_baseline)) | |
430 usage(); | 429 usage(); |
431 | 430 |
432 if (qslotsarg != NULL) /* process -qslots if it was present */ | 431 if (qslotsarg != NULL) /* process -qslots if it was present */ |
433 if (! set_quant_slots(cinfo, qslotsarg)) | 432 if (! set_quant_slots(cinfo, qslotsarg)) |
434 usage(); | 433 usage(); |
435 | 434 |
436 if (samplearg != NULL) /* process -sample if it was present */ | 435 if (samplearg != NULL) /* process -sample if it was present */ |
437 if (! set_sample_factors(cinfo, samplearg)) | 436 if (! set_sample_factors(cinfo, samplearg)) |
438 usage(); | 437 usage(); |
439 | 438 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 fclose(output_file); | 596 fclose(output_file); |
598 | 597 |
599 #ifdef PROGRESS_REPORT | 598 #ifdef PROGRESS_REPORT |
600 end_progress_monitor((j_common_ptr) &cinfo); | 599 end_progress_monitor((j_common_ptr) &cinfo); |
601 #endif | 600 #endif |
602 | 601 |
603 /* All done. */ | 602 /* All done. */ |
604 exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); | 603 exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); |
605 return 0; /* suppress no-return-value warnings */ | 604 return 0; /* suppress no-return-value warnings */ |
606 } | 605 } |
OLD | NEW |