www.pudn.com > face_recognition_source.zip > PPMFile.java
import java.lang.*;
import java.io.*;
/**
* PPM File reader/writer. Works with type 2,4-6.
*
*
*
*/
public class PPMFile implements xxxFile{
private byte bytes[]=null; // bytes which make up binary PPM image
private double doubles[] = null;
private String filename=null; // filename for PPM image
private int height = 0;
private int width = 0;
/**
* Read the PPM File.
*
* @throws FileNotFoundException if the directory/image specified is wrong
* @throws IOException if there are problems reading the file.
*/
public PPMFile(String filename) throws FileNotFoundException, IOException{
this.filename = filename;
readImage();
}
/**
* Get the height of the PPM image.
*
* @return the height of the image.
*/
public int getHeight() {
return height;
}
/**
* Get the width of the PPM image.
*
* @return the width of the image.
*/
public int getWidth() {
return width;
}
/**
* Get the data as byte array. Data is of any type that
* has been read from the file (usually 8bit RGB)
*
* @return The data of the image.
*/
public byte[] getBytes() {
return bytes;
}
/**
* Get the data as double array. Data is of any type that
* has been read from the file (usually 8bit RGB put into an 64bit double)
*
* @return The data of the image.
*/
public double[] getDouble() {
return doubles;
}
/**
* Write to fn file the data using the
* width, height variables. Data is assumed to be 8bit RGB.
*
* @throws FileNotFoundException if the directory/image specified is wrong
* @throws IOException if there are problems reading the file.
*/
public static void writeImage(String fn, byte[] data, int width, int height)
throws FileNotFoundException, IOException {
if (data != null) {
FileOutputStream fos = new FileOutputStream(fn);
fos.write(new String("P6\n").getBytes());
fos.write(new String( width + " " + height + "\n").getBytes());
fos.write(new String("255\n").getBytes());
System.out.println(data.length);
fos.write(data);
fos.close();
}
}
/**
* Read the image from the specified file.
*
* @throws FileNotFoundException pretty obvious
* @throws IOException filesystem related problems
* @throws NumberFormatException the input data is incorrect
*/
private void readImage() throws FileNotFoundException, IOException, NumberFormatException {
// read PPM format image
bytes=null;
char buffer; // character in PPM header
String id = new String(); // PPM magic number ("P6")
String dim = new String(); // image dimension as a string
int count = 0;
File f = new File(filename);
FileInputStream isr = new FileInputStream(f);
boolean weird = false;
do {
buffer = (char)isr.read();
id = id + buffer;
count ++;
} while (buffer != '\n' && buffer != ' ');
if (id.charAt(0) == 'P') {
buffer = (char)isr.read();count ++;
if (buffer == '#') {
do {
buffer = (char)isr.read();count ++;
} while (buffer != '\n');
count ++;
buffer = (char)isr.read();
}
// second header line is "width height\n"
do {
dim = dim + buffer;
buffer = (char)isr.read();count ++;
} while (buffer != ' ' && buffer != '\n');
width = Integer.parseInt(dim);
//System.out.print(width);
//System.out.flush();
dim = new String();
buffer = (char)isr.read();count ++;
do {
dim = dim + buffer;
buffer = (char)isr.read();count ++;
} while (buffer != ' ' && buffer != '\n');
height = Integer.parseInt(dim);
//System.out.println(" X " + height + " pixels.");
do { // third header line is max RGB value, e.g., "255\n"
buffer = (char)isr.read();count ++;
} while (buffer != ' ' && buffer != '\n');
//System.out.print("Reading image...");
//System.out.flush();
// remainder of file is width*height*3 bytes (red/green/blue triples)
bytes = new byte[height*width];
doubles = new double[height*width];
/*
Check for weird stuff
*/
if ((height*width + count*2) < f.length())
weird = true;
if ((id.charAt(1) == '5') || (id.charAt(1) == '6')) {
if (!weird)
isr.read(bytes,0,height*width);
// Now read in as double
else {
// There are nine bytes per RGB-tuple. Good for 32-bit color,
// not for us.
int v =0;
for (int i =0; i< height*width; i++) {
v = isr.read();
v = v + isr.read();
v = v + isr.read();
v = v / 3;
bytes[i] = (byte)( v & 0xFF);
}
}
}
if (id.charAt(1) == '2') {
int i = 0;
for (i =0; i < width*height;i++) {
dim = new String();
do {
buffer = (char)isr.read();
if (buffer != ' ' && buffer != '\n')
dim = dim + buffer;
} while (buffer != ' ' && buffer != '\n');
bytes[i] = (byte)(Integer.parseInt(dim) & 0xFF);
}
}
// Convert to double.
for (int i=0; i < height*width;i++)
doubles[i] = (double)(bytes[i] & 0xFF);
isr.close();
}
else {
width = height = 0;
doubles = new double[0]; bytes= new byte[0];
throw new NumberFormatException("Wrong header information!");
}
}
}