henesyinit from p9fd787fda5 years agoHistory
144 lines · 4.1 KB · Text
RawDownload
%! viewjpeg.ps   Copyright (C) Thomas Merz 1994%% View JPEG files with Ghostscript%% This PostScript code relies on level 2 features.%% Only JPEG baseline, extended sequential, and progressive files% are supported.  Note that Adobe PostScript level 2 does not include% progressive-JPEG support.  Ghostscript with IJG JPEG v6 or later% will decode progressive JPEG, but only if you edit gsjmorec.h to% enable that feature.%% Author's address:% ------------------------------+% {(pstack exec quit) = flush } |    Thomas Merz, Munich% pstack exec quit              |    voice +49/89/29160728% ------------------------------+    tm@muc.de  http://www.muc.de/~tm/%% Updated by L. Peter Deutsch 20-May-1997:%   move the usage example to the beginning% Updates by Tom Lane 6-Sep-1995 % Usage example:%	(jpeg-6/testimg.jpg) viewJPEG /languagelevel where {pop languagelevel 2 lt}{true} ifelse {  (JPEG needs PostScript Level 2!\n) print flush stop} if /JPEGdict 20 dict defJPEGdict begin /NoParamMarkers [	% JPEG markers without additional parameters    16#D0 16#D1 16#D2 16#D3 16#D4 16#D5 16#D6 16#D7 16#D8 16#01] def /NotSupportedMarkers [ 	% JPEG markers not supported by PostScript level 2    16#C3 16#C5 16#C6 16#C7 16#C8 16#C9 16#CA 16#CB 16#CD 16#CE 16#CF] def % Names of color spaces/ColorSpaceNames << /1 /DeviceGray /3 /DeviceRGB /4 /DeviceCMYK >> def % read one byte from file F% - ==> int --or-- stop context/NextByte {     F read not { (Read error in ViewJPEG!\n) print flush stop } if} bind def /SkipSegment {	% read two bytes and skip that much data    NextByte 8 bitshift NextByte add 2 sub { NextByte pop } repeat} bind def % read width, height, and # of components from JPEG markers% and store in dict/readJPEGmarkers {	% - ==> dict --or-- stop context    5 dict begin     { % loop: read JPEG marker segments until we find SOFn marker or EOF	NextByte	16#FF eq {				% found marker	    /markertype NextByte def	    % Is it S0F0=baseline, SOF1=extended sequential, SOF2=progressive ?	    markertype dup 16#C0 ge exch 16#C2 le and {		NextByte pop NextByte pop	% segment length		% Ghostscript and Adobe PS accept only data precision 8		NextByte 8 ne {		    (Error: not 8 bits per component!\n) print flush stop 		} if 		% Read crucial image parameters		/height NextByte 8 bitshift NextByte add def		/width NextByte 8 bitshift NextByte add def		/colors NextByte def 		DEBUG { currentdict { exch == == } forall flush } if		exit	    } if 	    % detect several segment types which are not compatible with PS	    NotSupportedMarkers {		markertype eq {		    (Marker ) print markertype == 		    (not supported!\n) print flush stop		} if 	    } forall  	    % Skip segment if marker has parameters associated with it	    true NoParamMarkers { markertype eq {pop false exit} if } forall 	    { SkipSegment } if	} if    } loop     currentdict dup /markertype undef    end} bind def end	% JPEGdict % read image parameters from JPEG file and display the image/viewJPEG {		% <file|string> ==> -    save     JPEGdict begin    /saved exch def    /scratch 1 string def    dup type /stringtype eq { (r) file } if    /F exch def     readJPEGmarkers begin    F 0 setfileposition		% reset file pointer     % We use the whole clipping area for the image (at least in one dimension)    gsave clippath pathbbox grestore    /ury exch def /urx exch def    /lly exch def /llx exch def     llx lly translate    width height scale     % use whole width or height, whichever is appropriate    urx llx sub width div ury lly sub height div    2 copy gt { exch } if pop		% min    dup scale    ColorSpaceNames colors scratch cvs get setcolorspace     % prepare image dictionary    << /ImageType 1       /Width width       /Height height       /ImageMatrix [ width 0 0 height neg 0 height ]       /BitsPerComponent 8       % If 4-component (CMYK), assume data is inverted per Adobe Photoshop       colors 4 eq {         /Decode [ colors { 1 0 } repeat ]       } {         /Decode [ colors { 0 1 } repeat ]       } ifelse       /DataSource F /DCTDecode filter    >> image     end		% image parameter dictionary     saved end restore} bind def