📄 djpeg.c
字号:
/* * djpeg.c * * Copyright (C) 1991-1994, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains a command-line user interface for the JPEG decompressor. * It should work on any system with Unix- or MS-DOS-style command lines. * * Two different command line styles are permitted, depending on the * compile-time switch TWO_FILE_COMMANDLINE: * djpeg [options] inputfile outputfile * djpeg [options] [inputfile] * In the second style, output is always to standard output, which you'd * normally redirect to a file or pipe to some other program. Input is * either from a named file or from standard input (typically redirected). * The second style is convenient on Unix but is unhelpful on systems that * don't support pipes. Also, you MUST use the first style if your system * doesn't do binary I/O to stdin/stdout. * To simplify script writing, the "-outfile" switch is provided. The syntax * djpeg [options] -outfile outputfile inputfile * works regardless of which command line style is used. */#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */#define JMAKE_MSG_TABLE#include "cderror.h" /* create message string table */#include "jversion.h" /* for version message */#ifdef HAVE_STDLIB_H#include <stdlib.h> /* to declare exit() */#endif#include <ctype.h> /* to declare isupper(), tolower() */#ifdef NEED_SIGNAL_CATCHER#include <signal.h> /* to declare signal() */#endif#ifdef USE_SETMODE#include <fcntl.h> /* to declare setmode() */#endif#ifdef THINK_C#include <console.h> /* command-line reader for Macintosh */#endif#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */#define READ_BINARY "r"#define WRITE_BINARY "w"#else#define READ_BINARY "rb"#define WRITE_BINARY "wb"#endif#ifndef EXIT_FAILURE /* define exit() codes if not provided */#define EXIT_FAILURE 1#endif#ifndef EXIT_SUCCESS#ifdef VMS#define EXIT_SUCCESS 1 /* VMS is very nonstandard */#else#define EXIT_SUCCESS 0#endif#endif#ifndef EXIT_WARNING#ifdef VMS#define EXIT_WARNING 1 /* VMS is very nonstandard */#else#define EXIT_WARNING 2#endif#endif/* * This list defines the known output image formats * (not all of which need be supported by a given version). * You can change the default output format by defining DEFAULT_FMT; * indeed, you had better do so if you undefine PPM_SUPPORTED. */typedef enum { FMT_GIF, /* GIF format */ FMT_PPM, /* PPM/PGM (PBMPLUS formats) */ FMT_RLE, /* RLE format */ FMT_TARGA, /* Targa format */ FMT_TIFF, /* TIFF format */ FMT_RAW /* RAW YCbCr subsampled 4:2:2*/} IMAGE_FORMATS;#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */#define DEFAULT_FMT FMT_PPM#endifstatic IMAGE_FORMATS requested_fmt;/* * Signal catcher to ensure that temporary files are removed before aborting. * NB: for Amiga Manx C this is actually a global routine named _abort(); * see -Dsignal_catcher=_abort in CFLAGS. Talk about bogus... */#ifdef NEED_SIGNAL_CATCHERstatic j_common_ptr sig_cinfo;GLOBAL voidsignal_catcher (int signum){ if (sig_cinfo != NULL) { if (sig_cinfo->err != NULL) /* turn off trace output */ sig_cinfo->err->trace_level = 0; jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */ } exit(EXIT_FAILURE);}#endif/* * Argument-parsing code. * The switch parser is designed to be useful with DOS-style command line * syntax, ie, intermixed switches and file names, where only the switches * to the left of a given file name affect processing of that file. * The main program in this file doesn't actually use this capability... */static char * progname; /* program name for error messages */static char * outfilename; /* for -outfile switch */LOCAL voidusage (void)/* complain about bad command line */{ fprintf(stderr, "usage: %s [switches] ", progname);#ifdef TWO_FILE_COMMANDLINE fprintf(stderr, "inputfile outputfile\n");#else fprintf(stderr, "[inputfile]\n");#endif fprintf(stderr, "Switches (names may be abbreviated):\n"); fprintf(stderr, " -colors N Reduce image to no more than N colors\n");#ifdef GIF_SUPPORTED fprintf(stderr, " -gif Select GIF output format\n");#endif#ifdef PPM_SUPPORTED fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format (default)\n");#endif fprintf(stderr, " -quantize N Same as -colors N\n");#ifdef RLE_SUPPORTED fprintf(stderr, " -rle Select Utah RLE output format\n");#endif#ifdef TARGA_SUPPORTED fprintf(stderr, " -targa Select Targa output format\n");#endif#ifdef RAW_SUPPORTED fprintf(stderr, " -raw Select raw output format\n");#endif fprintf(stderr, "Switches for advanced users:\n");#ifdef BLOCK_SMOOTHING_SUPPORTED fprintf(stderr, " -blocksmooth Apply cross-block smoothing\n");#endif fprintf(stderr, " -grayscale Force grayscale output\n"); fprintf(stderr, " -nodither Don't use dithering in quantization\n"); fprintf(stderr, " -nosmooth Don't use high-quality upsampling\n");#ifdef QUANT_1PASS_SUPPORTED fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n");#endif fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n"); exit(EXIT_FAILURE);}LOCAL booleankeymatch (char * arg, const char * keyword, int minchars)/* Case-insensitive matching of (possibly abbreviated) keyword switches. *//* keyword is the constant keyword (must be lower case already), *//* minchars is length of minimum legal abbreviation. */{ register int ca, ck; register int nmatched = 0; while ((ca = *arg++) != '\0') { if ((ck = *keyword++) == '\0') return FALSE; /* arg longer than keyword, no good */ if (isupper(ca)) /* force arg to lcase (assume ck is already) */ ca = tolower(ca); if (ca != ck) return FALSE; /* no good */ nmatched++; /* count matched characters */ } /* reached end of argument; fail if it's too short for unique abbrev */ if (nmatched < minchars) return FALSE; return TRUE; /* A-OK */}LOCAL intparse_switches (j_decompress_ptr cinfo, int last_file_arg_seen, int argc, char **argv)/* Initialize cinfo with default switch settings, then parse option switches. * Returns argv[] index of first file-name argument (== argc if none). * Any file names with indexes <= last_file_arg_seen are ignored; * they have presumably been processed in a previous iteration. * (Pass 0 for last_file_arg_seen on the first or only iteration.) */{ int argn; char * arg; /* Set up default JPEG parameters. */ requested_fmt = DEFAULT_FMT; /* set default output file format */ outfilename = NULL; cinfo->err->trace_level = 0; /* Scan command line options, adjust parameters */ for (argn = 1; argn < argc; argn++) { arg = argv[argn]; if (*arg != '-') { /* Not a switch, must be a file name argument */ if (argn <= last_file_arg_seen) { outfilename = NULL; /* -outfile applies to just one input file */ continue; /* ignore this name if previously processed */ } break; /* else done parsing switches */ } arg++; /* advance past switch marker character */ if (keymatch(arg, "blocksmooth", 1)) { /* Enable cross-block smoothing. */ cinfo->do_block_smoothing = TRUE; } else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) || keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) { /* Do color quantization. */ int val; if (++argn >= argc) /* advance to next argument */ usage(); if (sscanf(argv[argn], "%d", &val) != 1) usage(); cinfo->desired_number_of_colors = val; cinfo->quantize_colors = TRUE; } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { /* Enable debug printouts. */ /* On first -d, print version identification */ static boolean printed_version = FALSE; if (! printed_version) { fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", JVERSION, JCOPYRIGHT); printed_version = TRUE; } cinfo->err->trace_level++; } else if (keymatch(arg, "gif", 1)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -