⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djpeg.pas

📁 用pascal寫的jpeg codec, 測試過的
💻 PAS
📖 第 1 页 / 共 2 页
字号:
Program DJpeg;


{ djpeg.c ; Copyright (C) 1991-1996, Thomas G. Lane.  }

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

{$define TWO_FILE_COMMANDLINE}
{$define BMP_SUPPORTED}
{-$define GIF_SUPPORTED}
{-$define PPM_SUPPORTED}
{-$define RLE_SUPPORTED}
{$define TARGA_SUPPORTED}

{$I jconfig.inc}

uses
  jmorecfg,
  jpeglib,
  jerror,
  RdColMap,
  jdeferr,
  jdapimin, jdapistd, jdatasrc, wrbmp, wrtarga,
  cdjpeg;		{ Common decls for cjpeg/djpeg applications }
  		{ for version message }

  {ctype.h}		{ to declare isprint() }





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

type
  IMAGE_FORMATS = (
	FMT_BMP,		{ BMP format (Windows flavor) }
	FMT_GIF,		{ GIF format }
	FMT_OS2,		{ BMP format (OS/2 flavor) }
	FMT_PPM,		{ PPM/PGM (PBMPLUS formats) }
	FMT_RLE,		{ RLE format }
	FMT_TARGA,		{ Targa format }
	FMT_TIFF);		{ TIFF format }

const
  DEFAULT_FMT = FMT_PPM;

var
  requested_fmt : IMAGE_FORMATS;


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


var
  progname,	                { program name for error messages }
  outfilename : string[127];	{ for -outfile switch }


{LOCAL}
procedure usage;
const
  default_txt : array[boolean] of string[30] = ('', ' (default)');
{ complain about bad command line }
begin
  Write  (output, 'usage: ', progname, ' [switches] ');
{$ifdef TWO_FILE_COMMANDLINE}
  WriteLn(output, 'inputfile outputfile');
{$else}
  WriteLn(output, '[inputfile]');
{$endif}

  WriteLn(output, 'Switches (names may be abbreviated):');
  WriteLn(output, '  -colors N      Reduce image to no more than N colors');
  WriteLn(output, '  -fast          Fast, low-quality processing');
  WriteLn(output, '  -grayscale     Force grayscale output');
{$ifdef IDCT_SCALING_SUPPORTED}
  WriteLn(output, '  -scale M/N     Scale output image by fraction M/N, eg, 1/8');
{$endif}
{$ifdef BMP_SUPPORTED}
  WriteLn(output, '  -bmp           Select BMP output format (Windows style)',
	  default_txt[DEFAULT_FMT = FMT_BMP]);
{$endif}
{$ifdef GIF_SUPPORTED}
  WriteLn(output, '  -gif           Select GIF output format',
  	  default_txt[DEFAULT_FMT = FMT_GIF]);
{$endif}
{$ifdef BMP_SUPPORTED}
  WriteLn(output, '  -os2           Select BMP output format (OS/2 style)',
	  default_txt[DEFAULT_FMT = FMT_OS2]);
{$endif}
{$ifdef PPM_SUPPORTED}
  WriteLn(output, '  -pnm           Select PBMPLUS (PPM/PGM) output format',
  	  default_txt[DEFAULT_FMT = FMT_PPM]);
{$endif}
{$ifdef RLE_SUPPORTED}
  WriteLn(output, '  -rle           Select Utah RLE output format',
	  default_txt[DEFAULT_FMT = FMT_RLE]);
{$endif}
{$ifdef TARGA_SUPPORTED}
  WriteLn(output, '  -targa         Select Targa output format',
 	  default_txt[DEFAULT_FMT = FMT_TARGA]);
{$endif}
  WriteLn(output, 'Switches for advanced users:');
{$ifdef DCT_ISLOW_SUPPORTED}
  WriteLn(output, '  -dct int       Use integer DCT method',
	  default_txt[JDCT_DEFAULT = JDCT_ISLOW]);
{$endif}
{$ifdef DCT_IFAST_SUPPORTED}
  WriteLn(output, '  -dct fast      Use fast integer DCT (less accurate)',
          default_txt[JDCT_DEFAULT = JDCT_IFAST]);
{$endif}
{$ifdef DCT_FLOAT_SUPPORTED}
  WriteLn(output, '  -dct float     Use floating-point DCT method',
          default_txt[JDCT_DEFAULT = JDCT_FLOAT]);
{$endif}
  WriteLn(output, '  -dither fs     Use F-S dithering (default)');
  WriteLn(output, '  -dither none   Don''t use dithering in quantization');
  WriteLn(output, '  -dither ordered  Use ordered dither (medium speed, quality)');
{$ifdef QUANT_2PASS_SUPPORTED}
  WriteLn(output, '  -map FILE      Map to colors used in named image file');
{$endif}
  WriteLn(output, '  -nosmooth      Don''t use high-quality upsampling');
{$ifdef QUANT_1PASS_SUPPORTED}
  WriteLn(output, '  -onepass       Use 1-pass quantization (fast, low quality)');
{$endif}
  WriteLn(output, '  -maxmemory N   Maximum memory to use (in kbytes)');
  WriteLn(output, '  -outfile name  Specify name for output file');
  WriteLn(output, '  -verbose  or  -debug   Emit debug output');
  Halt(EXIT_FAILURE);
end;


{LOCAL}
function parse_switches (cinfo : j_decompress_ptr;
		         last_file_arg_seen : int;
                         for_real : boolean) : int;
{ Parse optional 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.)
  for_real is FALSE on the first (dummy) pass; we may skip any expensive
  processing. }
var
  argn,
  argc : int;
  arg : string;
var
  value, code : int;
{$ifdef QUANT_2PASS_SUPPORTED}	{ otherwise can't quantize to supplied map }
var
  mapfile : FILEptr;
{$endif}
const
  printed_version : boolean = FALSE;
var
  lval : long;
  ch : char;
begin
  { Set up default JPEG parameters. }
  requested_fmt := DEFAULT_FMT;	{ set default output file format }
  outfilename := '';
  cinfo^.err^.trace_level := 0;

  { Scan command line options, adjust parameters }

  argn := 0;
  argc := ParamCount;

  while argn <= ParamCount do
  begin
    Inc(argn);
    arg := ParamStr(argn);
    if (arg[1] <> '-') then
    begin
      { Not a switch, must be a file name argument }
      if (argn <= last_file_arg_seen) then
      begin
	outfilename := '';	{ -outfile applies to just one input file }
	continue;		{ ignore this name if previously processed }
      end;
      break;			{ else done parsing switches }
    end;
    {Inc(arg);			{ advance past switch marker character }

    if (keymatch(arg, '-bmp', 2)) then
    begin
      { BMP output format. }
      requested_fmt := FMT_BMP;

    end
    else
      if (keymatch(arg, '-colors', 2)) or (keymatch(arg, '-colours', 2)) or
         (keymatch(arg, '-quantize', 2)) or (keymatch(arg, '-quantise', 2)) then
      begin  { Do color quantization. }

        Inc(argn);
        if (argn >= argc) then	{ advance to next argument }
	  usage;
        Val(ParamStr(argn), value, code);
        if code <> 0 then
	  usage;
        cinfo^.desired_number_of_colors := value;
        cinfo^.quantize_colors := TRUE;
      end
      else
        if (keymatch(arg, '-dct', 3)) then
        begin  { Select IDCT algorithm. }
          Inc(argn);
          if (argn >= argc) then	{ advance to next argument }
	    usage;
          if (keymatch(ParamStr(argn), 'int', 1)) then
	    cinfo^.dct_method := JDCT_ISLOW
          else
            if (keymatch(ParamStr(argn), 'fast', 2)) then
              cinfo^.dct_method := JDCT_IFAST
            else
              if (keymatch(ParamStr(argn), 'float', 2)) then
                cinfo^.dct_method := JDCT_FLOAT
              else
	        usage;
        end
        else
          if (keymatch(arg, '-dither', 3)) then
          begin { Select dithering algorithm. }
            Inc(argn);
            if (argn >= argc) then	{ advance to next argument }
	      usage;
            if (keymatch(ParamStr(argn), 'fs', 2)) then
	      cinfo^.dither_mode := JDITHER_FS
            else
              if (keymatch(ParamStr(argn), 'none', 2)) then
                cinfo^.dither_mode := JDITHER_NONE
              else
                if (keymatch(ParamStr(argn), 'ordered', 2)) then
                  cinfo^.dither_mode := JDITHER_ORDERED
                else
                  usage;
          end
          else
            if (keymatch(arg, '-debug', 2)) or (keymatch(arg, '-verbose', 2)) then
            begin  { Enable debug printouts. }
              { On first -d, print version identification }

              if (not printed_version) then
              begin
	        WriteLn(output, 'PASJPEG Group''s DJPEG, version ',
		      JVERSION);
                WriteLn(output, JCOPYRIGHT);
                WriteLn(output, JNOTICE);
                printed_version := TRUE;
              end;
              Inc(cinfo^.err^.trace_level);
            end
            else
              if (keymatch(arg, '-fast', 2)) then
              begin
                { Select recommended processing options for quick-and-dirty output. }
                cinfo^.two_pass_quantize := FALSE;
                cinfo^.dither_mode := JDITHER_ORDERED;
                if (not cinfo^.quantize_colors) then { don't override an earlier -colors }
	          cinfo^.desired_number_of_colors := 216;
                cinfo^.dct_method := JDCT_FASTEST;
                cinfo^.do_fancy_upsampling := FALSE;
              end
              else
                if (keymatch(arg, '-gif', 2)) then
                begin  { GIF output format. }
                  requested_fmt := FMT_GIF;
                end
                else
                  if (keymatch(arg, '-grayscale', 3)) or
                     (keymatch(arg, '-greyscale',3)) then
                  { Force monochrome output. }
                    cinfo^.out_color_space := JCS_GRAYSCALE
                  else
                    if (keymatch(arg, '-map', 4)) then
                    begin
                      { Quantize to a color map taken from an input file. }
                      Inc(argn);
                      if (argn >= argc) then	{ advance to next argument }
	                usage;
                      if (for_real) then
                      begin	{ too expensive to do twice! }
{$ifdef QUANT_2PASS_SUPPORTED}	{ otherwise can't quantize to supplied map }
                        assign(mapfile^, ParamStr(argn));
                        {$I-}
                        reset(mapfile^, 1);
                        {$IFDEF IoCheck} {$I+} {$ENDIF}
                        if (IOresult <> 0) then
                        begin
	                  WriteLn(output, progname, ': can''t open ', ParamStr(argn));
	                  Halt(EXIT_FAILURE);
	                end;
	                read_color_map(cinfo, mapfile^);
	                system.close(mapfile^);
	                cinfo^.quantize_colors := TRUE;
{$else}
	                ERREXIT(j_common_ptr(cinfo), JERR_NOT_COMPILED);
{$endif}
                      end;
                    end
                    else
                      if (keymatch(arg, '-maxmemory', 4)) then
                      begin
                        { Maximum memory in Kb (or Mb with 'm'). }

                        ch := 'x';

                        Inc(argn);
                        if (argn >= argc) then	{ advance to next argument }
	                  usage;
                        Val(ParamStr(argn), lval, code);
                        if (code <> 1) then
	                  usage;
                        if (ch = 'm') or (ch = 'M') then
	                  lval := lval * long(1000);
                        cinfo^.mem^.max_memory_to_use := lval * long(1000);

                      end
                      else
                        if (keymatch(arg, '-nosmooth', 4)) then
                        begin
                          { Suppress fancy upsampling }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -