1  import java.awt.Color;
  2  import java.io.File;
  3  import java.net.URL;
  4  import java.awt.image.BufferedImage;
  5  import java.awt.image.ColorModel;
  6  import java.awt.image.Raster;
  7  import java.awt.image.WritableRaster;
  8  import javax.imageio.ImageIO;
  9  import javax.swing.ImageIcon;
 10  import javax.swing.JFileChooser;
 11  import javax.swing.JFrame;
 12  import javax.swing.JLabel;
 13  
 14  /**
 15     A picture whose pixels can be read and written.
 16  */
 17  public class Picture
 18  { 
 19     private String source;
 20     private JFrame frame;
 21     private JLabel label;
 22     private BufferedImage image;
 23  
 24     /**
 25        Constructs a picture with no image.
 26     */
 27     public Picture()
 28     {
 29        frame = new JFrame();
 30        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 31        label = new JLabel("(No image)");
 32        frame.add(label);
 33        frame.pack();
 34        frame.setVisible(true);      
 35     }
 36  
 37     /**
 38        Gets the width of this picture.
 39        @return the width
 40     */ 
 41     public int getWidth() { return image.getWidth(); }
 42     
 43     /**
 44        Gets the height of this picture.
 45        @return the height
 46     */ 
 47     public int getHeight() { return image.getHeight(); }
 48     
 49     /**
 50        Loads a picture from a given source. 
 51        @param source the image source. If the source starts
 52        with http://, it is a URL, otherwise, a filename.
 53     */ 
 54     public void load(String source)
 55     {
 56        try 
 57        {
 58           this.source = source;
 59           BufferedImage img;
 60           if (source.startsWith("http://"))
 61              img = ImageIO.read(new URL(source).openStream());
 62           else
 63              img = ImageIO.read(new File(source));
 64  
 65           setImage(img);        
 66        }
 67        catch (Exception ex)
 68        {
 69           this.source = null;
 70           ex.printStackTrace();
 71        }
 72     }      
 73  
 74     /**
 75        Reloads this picture, undoing any manipulations.
 76     */ 
 77     public void reload()
 78     {
 79        load(source);
 80     }
 81     
 82     /**
 83        Displays a file chooser for picking a picture.
 84     */ 
 85     public void pick()
 86     {
 87        JFileChooser chooser = new JFileChooser(".");
 88        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
 89        {
 90           load(chooser.getSelectedFile().getAbsolutePath());
 91        }
 92     }   
 93  
 94     private void setImage(BufferedImage image)
 95     {
 96        this.image = image;
 97        label.setIcon(new ImageIcon(image));
 98        label.setText(" ");
 99        frame.pack();
100     }
101  
102     /**
103        Gets the color of a pixel.
104        @param x the column index (between 0 and getWidth() - 1)
105        @param y the row index (between 0 and getHeight() - 1)
106        @return the color of the pixel at position (x, y)
107     */ 
108     public Color getColorAt(int x, int y)
109     {
110        Raster raster = image.getRaster();
111        ColorModel model = image.getColorModel();
112        int argb = model.getRGB(raster.getDataElements(x, y, null));
113        return new Color(argb, true);
114     }
115  
116     /**
117        Sets the color of a pixel.
118        @param x the column index (between 0 and getWidth() - 1)
119        @param y the row index (between 0 and getHeight() - 1)
120        @param c the color for the pixel at position (x, y)
121     */
122     public void setColorAt(int x, int y, Color c)
123     {
124        WritableRaster raster = image.getRaster();
125        ColorModel model = image.getColorModel();
126        Object colorData = model.getDataElements(c.getRGB(), null);
127        raster.setDataElements(x, y, colorData);
128        label.repaint();
129     } 
130  }