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

📄 pm3dconverttoimage.awk

📁 智能画图软件
💻 AWK
字号:
# pm3dConvertToImage.awk# Written by Petr Mikulik, mikulik@physics.muni.cz# Code of pm3dImage contributed by Dick Crawford# Version: 8. 7. 2002## This awk script tries to compress maps in a postscript file created by pm3d# or gnuplot with pm3d splotting mode. If the input data formed a rectangular# equidistant map (matrix), then its postscript representation is converted# into an image operator with 256 levels (of gray or colour). This conversion# makes the image 20 times smaller.## Usage:#    gnuplot>set out "|awk -f pm3dConvertToImage.awk >image.ps"# or#    your_shell>awk -f pm3dConvertToImage.awk <map.ps >image.ps## Distribution policy: this script belongs to the distribution of pm3d and# gnuplot programs.## Notes:#    - no use of run length encoding etc --- you are welcome to contribute#      an awk implementation## History of changes:#    - 8.  7. 2002 Petr Mikulik: Don't fail on empty map. Treat properly both#      cases of scans_in_x.#    - 4.  7. 2002 Petr Mikulik: Fix for compressing several images in one file.#    - 3. 10. 2001 Petr Mikulik: Replaced "stroke" by "Stroke" in the "/g"#      definition - fixes conversion of colour images.#    - 16. 5. 2000 Petr Mikulik and Dick Crawford: The first version.## License: public domain.BEGIN {err = "/dev/stderr"if (ARGC!=1) {  print "pm3dConvertToImage.awk --- (c) Petr Mikulik, Brno. Version 8. 7. 2002" >err  print "Compression of matrix-like pm3d .ps files into 256 levels image. See also" >err  print "header of this script for more info." >err  print "Usage:\n\t[stdout | ] awk -f pm3dConvertToImage.awk [<inp_file.ps] >out_file.ps" >err  print "Example for gnuplot:" >err  print "\tset out \"|awk -f pm3dConvertToImage.awk >smaller.ps\"" >err  print "Hint: the region to be converted is between %pm3d_map_begin and %pm3d_map_end" >err  print "keywords. Rename them to avoid converting specified region." >err  error = -1  exit(1)}# Setup of main variables.inside_pm3d_map = 0pm3d_images = 0# The following global variables will be used:error=0pm3dline=0scans=0; scan_pts=0; scans_in_x=0x1=0; y1 = 0; cell_x=0; cell_y=0x2=0; y2 = 0; x2last=0; y2last=0}######################################### Add definition of pm3dImage to the dictionary$1=="/BoxFill" && $NF=="def" {printprint "/Stroke {stroke} def"print "/pm3dImage {/I exch def gsave		% saves the input array"print "  /ps 1 string def"# print "  Color not {/g {setgray} def} if	% avoid stroke in the usual def of /g"print "  /Stroke {} def			% avoid stroke in the usual def"print "  I 0 get I 1 get translate I 2 get rotate % translate & rotate"print "  /XCell I 3 get I 5 get div def	% pixel width"print "  /YCell I 4 get I 6 get div def	% pixel height"print "  0 1 I 6 get 1 sub {			% loop over rows"print "  /Y exch YCell mul def			% save y-coordinate"print "  0 1 I 5 get 1 sub {			% loop over columns"print "  XCell mul Y moveto XCell 0 rlineto 0 YCell rlineto"print "  XCell neg 0 rlineto closepath		% outline pixel"print "  currentfile ps readhexstring pop	% read hex value"print "  0 get cvi 255 div g			% convert to [0,1]"print "  fill } for } for grestore		% fill pixel & close loops"print "  } def"next}######################################### Start pm3d map region.!inside_pm3d_map && $1 == "%pm3d_map_begin" {inside_pm3d_map = 1pm3d_images++# initialize variables for the image descriptionpm3dline = 0scans = 1row[scans] = ""x2 = -29999.123; y2 = -29999.123next}######################################### Outside pm3d map region.!inside_pm3d_map {if ($1 == "%%Creator:")    print $0 ", compressed by pm3dConvertToImage.awk"else if ($1 == "/g" && $2 == "{stroke") {    # Replace "/g {stroke ...}" by "/g {Stroke ...}" (stroke cannot be used    # in the pm3dImage region.    $2 = "{Stroke"    print} else printnext}######################################### End of pm3d map region: write all.$1 == "%pm3d_map_end" {inside_pm3d_map = 0if (pm3dline==0) { # empty map    pm3d_images--;    next;}if (scans_in_x) { grid_y = scan_pts; grid_x = scans; }  else  { grid_x = scan_pts; grid_y = scans; }print "Info on pm3d image region number " pm3d_images ": grid " grid_x " x " grid_y >errprint "\tpoints: " pm3dline "  scans: " scans "  start point: " x1","y1 "  end point: " x2","y2 >err# write image headerprint "%pm3d_image_begin"if (x1 > x2) { x1+=cell_x; x2+=cell_x; } # align offset of the image corner by the cell dimensionif (y1 > y2) { y1+=cell_y; y2+=cell_y; }#ORIGINAL:scalex = (grid_x <= 1) ? cell_x : (x2-x1)*(grid_x/(grid_x-1))scaley = (grid_y <= 1) ? cell_y : (y2-y1)*(grid_y/(grid_y-1))if (scans_in_x)    print "[ " x1 " " y1 " 90 " scaley " -" scalex " " grid_y " " grid_x " ] pm3dImage"else    print "[ " x1 " " y1 " 0 " scalex " " scaley " " grid_x " " grid_y " ] pm3dImage"if (scan_pts*scans != pm3dline) {  print "ERROR: pm3d image is not grid, exiting." >err  error=1  exit(8)}# write the substituted image stufffor (i=1; i<=scans; i++)   print row[i];# write the tail of the image environmentprint "%pm3d_image_end"next}######################################### Read in the pm3d map/image data.{if (NF!=12 || toupper($2)!="G" || $5!="N") {	print "ERROR: Wrong (non-pm3d map) data on line " NR ", exiting." >err	error=1	exit(8)}pm3dline++;if (pm3dline==1) { # first point of the map	x1=$3; y1=$4; cell_x=$8;	x2=x1; y2=y1; cell_y=$9;} else {	x2last=x2; y2last=y2;	# remember previous point	x2=$3; y2=$4;		# remember the current point}if (pm3dline==2) { # determine whether data are scans in x or in y    if (y1==y2) { # y=const, scan in x	scans_in_x = 0;	if (x1==x2) { 	    print "ERROR: First two points are identical?! Exiting." >err	    error=1	    exit(5)	}    } else { # x=const, scan in y	if (x1!=x2) {		print "ERROR: Map is obviously not rectangular, exiting." >err		error=1		exit(5)	}	scans_in_x = 1;    }}if ( pm3dline>2 && ((!scans_in_x && y2!=y2last) || (scans_in_x && x2!=x2last)) ) {	if (scans==1) scan_pts = pm3dline-1	scans++	row[scans] = ""}# now remember the intensityrow[scans] = row[scans] sprintf( "%02X", $1*255 );next} # reading map/image data######################################### The end.END {if (error == 0 && inside_pm3d_map) {    print "ERROR: Corrupted pm3d block:  \"%pm3d_map_end\"  not found." >err    error=1}if (error==0) {    if (pm3d_images==0) 	print "No pm3d image found in the input file." >err    else	print "There were " pm3d_images " pm3d image(s) found in the input file." >err} else if (error>0) {	    print "An ERROR has been reported. This file is INCORRECT."	    print "An ERROR has been reported. Output file is INCORRECT." >err	}}# eof pm3dConvertToImage.awk

⌨️ 快捷键说明

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