// (C) 1998 René Scholz, <www.thur.de/~Voland/> // Time-stamp: <02.06.1999, 23:19:01, mrz@isun34> import java.io.*; import java.util.*; /** This class implements reading and writing of a normal PGM5-File, with considering of possible comments (#).<BR> Important: byte values are signed, so a value of -127 is original a 129! @see PicData @author <A HREF="http://www.thur.de/~Voland/">René Scholz</A>. */ public class pgm { /** Read the pgmfile into a byte-array (oder two arrays). @param <TT>p</TT> Helpobject, which gives the filename of the pgmfile. @see PicData#Name */ public static void read(PicData p) { try { FileInputStream fis = new FileInputStream(p.Name); BufferedReader r = new BufferedReader(new InputStreamReader(fis)); StreamTokenizer st = new StreamTokenizer(r); int type; st.commentChar('#'); st.eolIsSignificant(false); st.slashStarComments(false); st.slashSlashComments(false); try { type=st.nextToken(); if(type==st.TT_NUMBER || st.sval.compareTo("P5") !=0) { System.err.println("ERROR: " + p.Name + " is not a PGM-file!"); System.exit(-1); } type=st.nextToken(); p.X=(int)st.nval; // width type=st.nextToken(); p.Y=(int)st.nval; // height type=st.nextToken(); p.Colors=(int)st.nval+1; // max. color value +1 // from now on we have binary data switch(p.Dim) { case 2: p.data2D=new byte[p.X][p.Y]; for(int row=0; row<p.Y; row++) for(int col=0; col<p.X; col++) p.data2D[col][row]=(byte)(r.read()-128); break; case 1: int pixels=p.X*p.Y; p.data1D=new byte[pixels]; for(int i=0; i<pixels; i++) p.data1D[i]=(byte)(r.read()-128); break; case 3: // both 1dim and 2dim data to save p.data2D=new byte[p.X][p.Y]; p.data1D=new byte[p.X*p.Y]; for(int row=0, z=0; row<p.Y; row++) for(int col=0; col<p.X; col++) p.data2D[col][row]=p.data1D[z++]=(byte)(r.read()-128); break; } } catch(IOException e) { System.err.println("Error while reading file " + p.Name); System.exit(1); } } catch(FileNotFoundException e) { System.err.println("Error: File " + p.Name + " not found!"); System.exit(1); } } /** Write the reconstructed PGM-Picture to a file. @param <TT>p</TT> Helpobject, which gives the filename of the outputfile (which is a pgmfile). @see PicData#Name */ public static void write(PicData p) { String s=p.X + " " + p.Y; try { FileWriter fwr = new FileWriter(p.Name); BufferedWriter w = new BufferedWriter(fwr); w.write("P5", 0, 2); w.newLine(); if(p.Comment!=null) w.write(p.Comment, 0, p.Comment.length()); w.write(s, 0, s.length()); w.newLine(); s=String.valueOf(p.Colors); switch(s.length()) { case 1: s="00" + s; break; case 2: s="0" + s; break; } w.write(s, 0, 3); w.newLine(); switch(p.Dim) { case 2: for(int row=0; row<p.Y; row++) for(int col=0; col<p.X; col++) w.write( ((int)p.data2D[col][row]) +128); w.close(); break; case 1: case 3: int pixels=p.X*p.Y; for(int i=0; i<pixels; i++) w.write( ((int)p.data1D[i]) +128); w.close(); break; } } catch(IOException e) { System.err.println("Error while writing to file " + p.Name + "!"); System.exit(1); } } }