school/cs240/src/imageeditor/imagemap.java

164 lines
3.7 KiB
Java

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PushbackReader;
public class imagemap {
public int width;
public int height;
public int maxColorValue = 255;
public pixel[][] pixels;
public PushbackReader stream;
public imagemap(int width, int height, pixel[][] pixels) {
this.width = width;
this.height = height;
this.pixels = pixels;
}
public imagemap(String path) throws Exception {
try {
stream = new PushbackReader(new FileReader(path));
} catch (Exception e) {
throw new Exception("File not found.");
}
try {
readHeader();
pixels = new pixel[height][width];
readPixels();
} catch (Exception e) {
throw new Exception("File format not recognized.");
}
}
public imagemap set(int r, int c, pixel p) {
pixels[r][c] = p;
return this;
}
public pixel get(int r, int c) {
return pixels[r][c];
}
private imagemap readHeader() throws Exception {
return
uniqueNum()
.getDims()
.getMaxColor();
}
public pixel[] get(int r, int c1, int c2) {
if (c2 >= pixels[r].length) c2 = pixels[r].length - 1;
pixel[] curPixels = new pixel[c2 - c1 + 1];
for (int i = 0; c1 <= c2; i++, c1++) {
curPixels[i] = get(r, c1);
}
return curPixels;
}
private imagemap uniqueNum() throws Exception {
invalChar();
if (!readWord().equals("P3")) {
throw new Exception("File format not recognized.");
}
invalChar();
return this;
}
private imagemap readPixels() throws NumberFormatException, IOException {
for (int r = 0; r < height; r++) {
for (int c = 0; c < width; c++) {
int red = Integer.parseInt(readWord());
invalChar();
int green = Integer.parseInt(readWord());
invalChar();
int blue = Integer.parseInt(readWord());
invalChar();
pixels[r][c] = new pixel(red, green, blue);
}
}
return this;
}
private imagemap getDims() throws NumberFormatException, IOException {
width = Integer.parseInt(readWord());
invalChar();
height = Integer.parseInt(readWord());
invalChar();
return this;
}
private imagemap getMaxColor() throws NumberFormatException, IOException {
maxColorValue = Integer.parseInt(readWord());
invalChar();
return this;
}
private String readWord() throws IOException {
StringBuffer word = new StringBuffer();
int c;
while (isChar(c = stream.read())) {
word.append((char) c);
}
stream.unread(c);
return word.toString();
}
private imagemap invalChar() throws IOException {
int c;
while (!isChar(c = stream.read())) {
if (c == '#') {
while ((char) (c = stream.read()) != '\n' && c > -1);
stream.unread(c);
}
}
stream.unread(c);
return this;
}
public imagemap copyAll() {
pixel[][] curPixels = new pixel[pixels.length][];
for (int i = 0; i < pixels.length; i++)
curPixels[i] = pixels[i].clone();
return new imagemap(width, height, curPixels);
}
private boolean isChar(char c) {
return (c != '#' && c != '\n' && c != '\r' && c != '\t' && c != ' ');
}
public String headerString() {
return "P3\n" + width + " " + height + "\n" + maxColorValue + "\n";
}
private boolean isChar(int c) {
return isChar((char) c);
}
public imagemap getEveryOne(pkpix cb) {
for (int r = 0; r < pixels.length; r++) {
for (int c = 0; c < pixels[r].length; c++) {
cb.handle(this, pixels[r][c], r, c);
}
}
return this;
}
public imagemap fileWritter(String path) throws IOException {
FileWriter w = new FileWriter(path);
String header = "P3\n" + width + " " + height + "\n" + maxColorValue + "\n";
w.write(header);
for (pixel[] row : pixels) {
for (pixel p : row) {
w.write(p.toString());
}
w.write('\n');
}
w.close();
return this;
}
}