/* * Created on 18 nov. 2005 * credits: largely inspired from : http://www.dickbaldwin.com/java/Java174.htm#pixelgrabber%20class%20class * * important methods are : constructor, setPixel, getPixel, getImage * */ package contribs.maploader; import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.ImageObserver; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; class SimpleImage extends Frame { private static final long serialVersionUID = -1L; private Image _image;//ref to raw image file fetched from disk // File references private String _filename; // name of the image file private int _width; // width of the image file private int _height; // height of the image file // the pixel matrix representing the image rbg pixels private int[] _pixelMatrix; public SimpleImage( String __filename , boolean __display) { // step 1 : load the image (jpeg, gif or png) _filename = __filename; _image = Toolkit.getDefaultToolkit().getImage(_filename); MediaTracker mediaTracker = new MediaTracker(this); mediaTracker.addImage(_image,1); try{ // (1) wait for image to be loaded (2) timeout in 10s if( !mediaTracker.waitForID(1,10000) ) { // indicates where the file has been searched, better when // you don't know where the file should be. System.out.println("[error] image could not be loaded."); System.out.println(" please verify that the file exists : "); System.err.println(" "+System.getProperty("user.dir")+System.getProperty("file.separator")+_filename); System.exit(-1); } } catch(InterruptedException e) { e.printStackTrace(); } // step 2 : register the image _width = _image.getWidth(this); _height = _image.getHeight(this); _pixelMatrix = new int [ _width * _height ]; try{ PixelGrabber pixelGrabber = new PixelGrabber(_image,0,0,_width,_height,_pixelMatrix,0,_width); if( ! ( pixelGrabber.grabPixels() && ((pixelGrabber.getStatus() & ImageObserver.ALLBITS) != 0) ) ) System.out.println("[error] grabbing failed."); } catch (InterruptedException e) { e.printStackTrace(); } // step 3 : if you want to display the image, display it if ( __display == true ) preparePaint(); } /** * get the raw pixel * @param __x position of x * @param __y position of y * @return the raw pixel value */ public int getRawPixel ( int __x, int __y ) { return ( _pixelMatrix[__y*_width+__x] ); } /** * set the raw pixel value * @param __x position of x * @param __y position of y * @param __rawvalue the new raw value of the pixel to set. */ public void setRawPixel ( int __x, int __y , int __rawvalue ) { _pixelMatrix[__y*_width+__x] = __rawvalue; } /** * return : alpha, red, green, blue (each 256 bits value) */ public int[] getPixel ( int __x, int __y ) { int values[] = new int[4]; int rawvalue = _pixelMatrix[__y*_width+__x]; values[0] = ( rawvalue & 0xFF000000 ) / (int)Math.pow(256,3); values[1] = ( rawvalue & 0x00FF0000 ) / (int)Math.pow(256,2); values[2] = ( rawvalue & 0x0000FF00 ) / 256; values[3] = ( rawvalue & 0x000000FF ); return ( values ); } /** * Set the value of a pixel (x,y) * @param __x coord x * @param __y coord y * @param __alpha alpha value (0-255) * @param __red red value (0-255) * @param __green green value (0-255) * @param __blue blue value (0-255) */ public void setPixel ( int __x, int __y , int __alpha, int __red, int __green, int __blue ) { if ( __red > 255 || __green > 255 || __blue > 255 || __alpha > 255 ) { System.out.println("[warning] setPixel values must be between 0 and 255."); return; } _pixelMatrix[__y*_width+__x] = __alpha * (int)Math.pow(256,3) + __red * (int)Math.pow(256,2) + __green * 256 + __blue ; } public Image getImage () { return ( this.createImage( new MemoryImageSource( _width, _height, _pixelMatrix, 0, _width) ) ); } /** * returns the width of the image. */ public int getWidth() { return (_width); } /** * returns the height of the image. */ public int getHeight() { return (_height); } /** * Displays informations about the picture loaded. */ public void displayInformation () { System.out.println("filename: " + _filename); System.out.println("width : " + _width); System.out.println("height : " + _height); } /** * Display the image in a frame. */ public void preparePaint() { this.setVisible(true); //inTop = this.getInsets().top; //inLeft = this.getInsets().left; this.setSize(this.getInsets().left+_width,this.getInsets().top+_height); this.setTitle("Image viewer"); this.setBackground(Color.black); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); } /** * paint the graphics in the frame. */ public void paint(Graphics g) { Image image = getImage(); g.drawImage(_image,this.getInsets().left,this.getInsets().top,this); // image at loading time g.drawImage(image,this.getInsets().left,this.getInsets().top+_height,this); // current image in memory } /* *** maintenant amusons nous un peu *** */ public void exampleImageManipulation_1 () { /* for( int i = 0; i < (_width*_height) ; i++ ) _pixelMatrix[i] = _pixelMatrix[i] & 0xFFFFFF; // alpha, R, G, B -- alpha=255=maxOpacity // ...SAME AS... **/ for ( int x = 0 ; x != _width ; x++ ) for ( int y = 0 ; y != _height ; y++ ) { int[] values = getPixel(x,y); setPixel (x,y,values[0],values[1],values[2],values[3]); // alpha, R, G, B -- alpha=255=maxOpacity } } public void exampleImageManipulation_2 () { for ( int x = 0 ; x != _width ; x++ ) for ( int y = 0 ; y != _height ; y++ ) { int[] values = getPixel(x,y); setPixel (x,y,255,(values[1]+1)%256,(values[2]+1)%256,(values[3]+1)%256); // alpha, R, G, B -- alpha=255=maxOpacity } } public void exampleImageManipulation_3 () { for ( int x = 10 ; x != _width-10 ; x++ ) for ( int y = 10 ; y != _height-10 ; y++ ) { int[] values = getPixel((int)((double)x-8*Math.sin(x)),(int)((double)y-4*Math.cos(y))); setPixel (x,y,255,(values[1]+1)%256,(values[2]+1)%256,(values[3]+1)%256); // alpha, R, G, B -- alpha=255=maxOpacity } } /* Main method for test and demo purpose */ public static void main(String[] args) { // Display Examples /* boolean display = false; SimpleImage simpleimage = new SimpleImage("nicolas/test.gif", display); simpleimage.displayInformation(); while (true) { simpleimage.exampleImageManipulation_3(); } //if ( display ) obj.repaint(); */ // Maze Display example boolean display = false; SimpleImage simpleimage = new SimpleImage("ressources/map1.png", display); simpleimage.displayInformation(); for ( int y = 0 ; y != simpleimage.getHeight() ; y++ ) { for ( int x = 0 ; x != simpleimage.getWidth() ; x++ ) { int [] values = simpleimage.getPixel(x,y); if ( values[1] == 255 && values[2] == 0 && values[3] == 0 ) System.out.print("#"); else if ( values[1] == 0 && values[2] == 255 && values[3] == 0 ) System.out.print("X"); else if ( values[1] == 0 && values[2] == 0 && values[3] == 255 ) System.out.print("!"); else System.out.print(" "); } System.out.print("\n"); } } }