Improve company productivity with a Business Account.Sign Up

  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 376
  • Last Modified:

drawing to buffer + flip to window

any sourcecodes for the following problem :
- i want to draw to a 2d array (24bit if possible)
- flip the array to the screen (to a size-fixed window)
- hell-fast (if possible)

do you have any sources for this. inclusive creating the size-fixed window and everything else. i want to calc some graphic effects (plasmas, etc.). if you've got any additional questions, feel free to ask.

thank you very much. i appreciate every comment.
1 Solution
>i want to draw to a 2d array
You can do that only since JDK1.2 by using BufferedImage.getGraphics() and then either using PixelGrabber or calling Raster.getPixels() on the BufferedImage's Raster to obtain the pixel values in the form of an int array (32 bits).
>flip the array to the screen (to a size-fixed window)
Just draw the BufferedImage on a showing Window.
>hell-fast (if possible)
Well, you don't really control it using the method I described.

Alternatively, since JDK1.0, you can implement your own drawing procedures, which would draw into an int array. You would then convert the array into an Image using Toolkit.createImage(ImageProducer) and MemoryImageSource.

To make the drawing as fast as possible, I recomment creating an offscreen Image using Component.createImage(int, int) - painting the actual image on it once and then painting the offscreen image on the screen every time (instead of the actual image).

Sasha Maryanovsky.
columbo666Author Commented:
very good. any code ? i tried to use these createImage-things (and others), but i couldn't get them working.
For which one of the ways? 1.1 or 1.2 compatible?

Sasha Maryanovsky.
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

columbo666Author Commented:
i've got 1.2, but you can do it also for 1.1. your decision
Well, 1.2 it's pretty easy:

int width = 300;
int height = 300;
BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
// Do various painting on the Graphics here.
int [] pixels = img.getRGB(0,0,width,height,null,0,width);

After this, "pixels" contains all the pixel values in aRGB format.

For 1.1, you will have to implement your own drawing routines, which is quite difficult, and I'm not going to explain this here :-)

Sasha Maryanovsky.
Umm, note that I didn't test this code, so it may be wrong :-)

Sasha Maryanovsky.
hi !
guess this website may help u...

hope it helps..:)
columbo666Author Commented:
i can really use that. thanks. a small detail : i want to draw only single pixels (and fill the whole buffer with them). any fast possibilities ?
columbo666Author Commented:
sorry, finally i can't really use that. i just want a complete piece of code, which creates a non-resizable window and draws an (pixel based & flickerless) animation within.
Hi Columbo! I've got the same problem - I want to render fast realtime fractal animations onto a fullscreen window. I worked myself through the JAVA 1.4 API and created this sourcecode out of some examples - it renders randomly colored pixels onto your screen.
The code is far from being optimzed, but it works. I'm still working on the code, because I need it myself, so maybe we could work together to get it running fast.

 * This demo shows how to render single pixels in a fullscreen window using double buffering

import java.awt.*;
import java.awt.image.*;
import java.util.Random;

public class MultiBufferTest extends Component{
    int width = 640;
    int height = 480;
    int size = width * height;
    int pixels[] = new int[size];
    int red;
    int green;
    int blue;
    int alpha = 255;
    MemoryImageSource source = new MemoryImageSource(width, height, pixels, 0, width);  
    Graphics g;
    Random r = new Random();
    /** constructor
    public MultiBufferTest() {
        // setup display
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = env.getDefaultScreenDevice();          
        GraphicsConfiguration gc = device.getDefaultConfiguration();

        // create frame
        Frame mainFrame = new Frame(gc);
        // start fullscreen
        device.setDisplayMode(new DisplayMode(width, height, 16, 85));
        // setup doubelbuffering
        BufferStrategy bufferStrategy = mainFrame.getBufferStrategy();
        // setup image source
        Image image = createImage(source);

        // loop for 50 times and draw random pixels
        for (int t = 0; t < 50; t++) {
            // get offscreen image
            g = bufferStrategy.getDrawGraphics();
            for (int j = 0; j < size; j++) {
                // randomize colors
                red = Math.abs(r.nextInt()) % 255;
                green = Math.abs(r.nextInt()) % 255;
                blue = Math.abs(r.nextInt()) % 255;
                // set pixel
                pixels[j] = (alpha << 24) | (red << 16) | (green << 8 ) | blue;
            // draw new pixels
            g.drawImage(createImage(source), 0,0, this);
            // flip offscreen image to screen
            // release offscreen image
        // exit

    public static void main(String[] args) {
        MultiBufferTest test = new MultiBufferTest();
columbo666Author Commented:
dunno, the project was done now without this and i can code java a bit now...
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

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