Link to home
Start Free TrialLog in
Avatar of oreg
oreg

asked on

Making image from Pixel Data

Hi,

I have been playing with images recently, particularly grabbing pixel data from an image using the PixelGrabber classes and storing this pixel data in an int array.  From t here I have been reading various information about argb.  I then started to edit this pixel data ( again, it is an int array ) and now I would like to draw this new image. ( I am just learning about pixel data, and things I can do...my first example is just making a color image grayscale ).

Now, if I take my int array and draw out each individual pixel, I can do that...but it is dreadfully slow on a 450MHz machine.

So...what I want to know, is given an int array of pixel data, how can I change this into a Java Image object.  As I mentioned above, drawing each individual pixel to an image object is not an option, as it is way too slow...surly there must be a way in java to change pixel data to an image? ( since there is a way to change an image into pixel data )

Thank you for any help,
Oreg
ASKER CERTIFIED SOLUTION
Avatar of imladris
imladris
Flag of Canada image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of jsridhar
jsridhar

java.awt.image.MemoryImageSource is the class you are looking. The following is explain better:

/**
 * This class is an implementation of the ImageProducer interface which
 * uses an array to produce pixel values for an Image.  Here is an example
 * which calculates a 100x100 image representing a fade from black to blue
 * along the X axis and a fade from black to red along the Y axis:
 * <pre>
 *
 *      int w = 100;
 *      int h = 100;
 *      int pix[] = new int[w * h];
 *      int index = 0;
 *      for (int y = 0; y < h; y++) {
 *          int red = (y * 255) / (h - 1);
 *          for (int x = 0; x < w; x++) {
 *            int blue = (x * 255) / (w - 1);
 *            pix[index++] = (255 << 24) | (red << 16) | blue;
 *          }
 *      }
 *      Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
 *
 * </pre>
 * The MemoryImageSource is also capable of managing a memory image which
 * varies over time to allow animation or custom rendering.  Here is an
 * example showing how to set up the animation source and signal changes
 * in the data (adapted from the MemoryAnimationSourceDemo by Garth Dickie):
 * <pre>
 *
 *      int pixels[];
 *      MemoryImageSource source;
 *
 *      public void init() {
 *          int width = 50;
 *          int height = 50;
 *          int size = width * height;
 *          pixels = new int[size];
 *
 *          int value = getBackground().getRGB();
 *          for (int i = 0; i < size; i++) {
 *            pixels[i] = value;
 *          }
 *
 *          source = new MemoryImageSource(width, height, pixels, 0, width);
 *          source.setAnimated(true);
 *          image = createImage(source);
 *      }
 *
 *      public void run() {
 *          Thread me = Thread.currentThread( );
 *          me.setPriority(Thread.MIN_PRIORITY);
 *
 *          while (true) {
 *            try {
 *                thread.sleep(10);
 *            } catch( InterruptedException e ) {
 *                return;
 *            }
 *
 *            // Modify the values in the pixels array at (x, y, w, h)
 *
 *            // Send the new data to the interested ImageConsumers
 *            source.newPixels(x, y, w, h);
 *          }
 *      }

js.