[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 237
  • Last Modified:

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
0
oreg
Asked:
oreg
1 Solution
 
imladrisCommented:
There is a corresponding class called MemoryImageSource in java.awt.image that does exactly what you are after. You activate it with a call to createImage (in Component or Toolkit class) and the MemoryImageSource imageproducer object you have created.
0
 
jsridharCommented:
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.
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now