/home/ooechs/ECJ_Tutorial/src/ac/essex/ecj/imaging/PixelLoader.java

package ac.essex.ecj.imaging; 
 
import java.awt.image.BufferedImage; 
import java.awt.*; 
import java.io.File; 
 
/** 
 * Loads Pixels from an image file. 
 */ 
public class PixelLoader implements Cloneable { 
 
    File file = null; 
 
    BufferedImage img; 
 
    public PixelLoader(String filename) throws Exception { 
        this(new File(filename)); 
    } 
 
    public Object clone() throws CloneNotSupportedException { 
        return super.clone(); 
    } 
 
    public BufferedImage getBufferedImage() { 
        return img; 
    } 
 
 
    public PixelLoader(File imageFile) throws Exception { 
 
        // ensure that the file actually exists before proceeding 
        if (!imageFile.exists()) throw new Exception("File does not exist: " + imageFile.getAbsolutePath()); 
 
        // save a reference to the file 
        this.file = imageFile; 
 
        // Use the Java ImageIO library to open the file as a buffered image. 
        img = javax.imageio.ImageIO.read(imageFile); 
 
 
    } 
 
 
    public File getFile() { 
        return file; 
    } 
 
    int[][] greyColourCache; 
 
    /** 
     * Gets a grayscale value of the pixel 
     * 
     * @param x 
     * @param y 
     * @return 
     * @throws RuntimeException 
     */ 
    public int getPixel(int x, int y) throws RuntimeException { 
 
        // this is called many times for each pixel. Hence we'll do the maths once only. 
        if (greyColourCache == null) createColourCaches(); 
 
        return greyColourCache[x][y]; 
 
 
    } 
 
    public int getBooleanPixel(int x, int y) { 
        return getPixel(x, y) == 0 ? 0 : 1; 
    } 
 
 
    private void createColourCaches() { 
 
        greyColourCache = new int[img.getWidth()][img.getHeight()]; 
 
        for (int yPos = 0; yPos < img.getHeight(); yPos++) { 
            for (int xPos = 0; xPos < img.getWidth(); xPos++) { 
 
                // get a colour object, which saves us having to shift bits and other stuff. 
                Color c = new Color(img.getRGB(xPos, yPos)); 
 
                // extract the colours 
                int red = c.getRed(); 
                int green = c.getGreen(); 
                int blue = c.getBlue(); 
 
                greyColourCache[xPos][yPos] = (int) ((red * 0.3) + (green * 0.59) + (blue * 0.11)); 
 
            } 
 
        } 
    } 
 
    public static final int RED = new Color(255, 20, 0).getRGB(); 
    public static final int BLUE = new Color(20, 20, 255).getRGB(); 
 
    public void setPixelRed(int x, int y) { 
        setPixel(x, y, RED); 
    } 
 
    public void setPixelBlue(int x, int y) { 
        setPixel(x, y, BLUE); 
    } 
 
 
    public void setPixel(int x, int y, int colour) { 
 
        img.setRGB(x, y, colour); 
        if (greyColourCache != null) { 
            greyColourCache[x][y] = colour; 
        } 
 
    } 
 
    public void save(String filename) throws Exception { 
        save(new File(filename)); 
    } 
 
    public void save(File imageFile) throws Exception { 
 
        // Use the Java ImageIO library to shave the file as a BMP image 
        javax.imageio.ImageIO.write(img, "bmp", imageFile); 
 
 
    } 
 
    public int getWidth() { 
        return img.getWidth(); 
    } 
 
    public int getHeight() { 
        return img.getHeight(); 
    } 
 
}