RofaelEmil
RofaelEmil

Reputation: 85

Image of random pixels

I'm trying to make an image of random pixels. I wrote this code, but no usefulness LadderSnack.java

import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.*;

public class LadderSnack extends Canvas implements Runnable {
    public static JFrame frame = new JFrame("EmiloLadderSnack v. 1.0");
    public static int width = Toolkit.getDefaultToolkit().getScreenSize().width, height = Toolkit.getDefaultToolkit().getScreenSize().height;
    public boolean run = false;
    public Thread thread;
    public BufferedImage img;
    public int[] pixels;
    public Screen screen;

    public LadderSnack() {
        screen = new Screen(width, height);
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    }

    public void start() {
        if (run)
            return;
        run = true;
        thread = new Thread(this);
        thread.start();
    }

    public void stop() {
        if (!run)
            return;
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
    }

    public void run() {
        while (run) {
            trick();
            render();
        }
    }

    private void trick() {
    }

    private void render() {
        screen = new Screen(width, height);
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }
        for (int i = 0; i < width * height; i++)
            pixels[i] = screen.pixels[i];
        Graphics g = bs.getDrawGraphics();
        g.drawImage(img, 0, 0, width, height, null);
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        LadderSnack ladderSnack = new LadderSnack();

        frame.setSize(width, height);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.add(ladderSnack);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        ladderSnack.start();
    }
}

Render.java

public class Render {

public int width, height;
    public int[] pixels;

    public Render(int width, int height) {
        this.width = width;
        this.height = height;
        pixels = new int[width * height];
    }

    public void draw(Render render, int xOffset, int yOffset) {
        int xPixel, yPixel, y, x;
        for (x = 0; x < width; x++) {
            xPixel = x + xOffset;
            for (y = 0; y < height; y++) {
                yPixel = y + yOffset;
                pixels[xPixel + yPixel * width] = render.pixels[xPixel + yPixel * width];
            }
        }
    }
}

Screen.java

import java.awt.Toolkit;
import java.util.Random;

public class Screen extends Render {

    private Render test;

    public Screen(int width, int height) {
        super(width, height);
        int i;
        Random rand = new Random();
        test = new Render(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
        for (i = 0; i < width * height; i++)
            pixels[i] = rand.nextInt();
    }

    public void render() {
        draw(test, 0, 0);
    }
}

At runtime

public void render() {
    draw(test, 50, 50);
}

in Screen.java is never executed to move the image I want the image to move through the frame, as a step to make animation and an animated random pixels image. Please,Help me.

Upvotes: 1

Views: 3497

Answers (3)

lmaooooo
lmaooooo

Reputation: 3666

You may want to use my api: http://www.threadox.com/projects/random-image-api/ You receive a buffered image and then you just have to draw it to the canvas.

Upvotes: 2

RofaelEmil
RofaelEmil

Reputation: 85

LadderSnack.java

import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.*;

public class LadderSnack extends Canvas implements Runnable {
    public static JFrame frame = new JFrame("EmiloLadderSnack v. 1.0");
    public static int width = Toolkit.getDefaultToolkit().getScreenSize().width, height = Toolkit.getDefaultToolkit().getScreenSize().height;
    public boolean run = false;
    public Thread thread;
    public BufferedImage img;
    public int[] pixels;
    public Screen screen;

    public LadderSnack() {
        screen = new Screen(width, height);
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    }

    public void start() {
        if (run)
            return;
        run = true;
        thread = new Thread(this);
        thread.start();
    }

    public void stop() {
        if (!run)
            return;
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
    }

    public void run() {
        while (run) {
            trick();
            render();
        }
    }

    private void trick() {
    }

    private void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }
        for (int i = 0; i < width * height; i++)
            pixels[i] = screen.pixels[i];
        Graphics g = bs.getDrawGraphics();
        g.drawImage(img, 0, 0, width, height, null);
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        LadderSnack ladderSnack = new LadderSnack();

        frame.setSize(width, height);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.add(ladderSnack);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        ladderSnack.start();
    }
}

Render.java

public class Render {


public int width, height;
    public int[] pixels;

    public Render(int width, int height) {
        this.width = width;
        this.height = height;
        pixels = new int[width * height];
    }

    public void draw(Render render, int xOffset, int yOffset) {
        int xPixel, yPixel, y, x;
        for (x = 0; x < render.width; x++) {
            xPixel = x + xOffset;
            for (y = 0; y < render.height; y++) {
                yPixel = y + yOffset;
                pixels[xPixel + yPixel * width] = render.pixels[xPixel-xOffset + (yPixel-yOffset) * render.width];
            }
        }
    }
}

Screen.java

import java.awt.Toolkit;
import java.util.Random;

public class Screen extends Render {
    private Render test;

    public Screen(int width, int height) {
        super(width, height);
        int i;
        Random rand = new Random();
        test = new Render(333,333);//Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
        for (i = 0; i < 333 * 333; i++)
            test.pixels[i] = rand.nextInt();
        render();
    }

    public void render() {
        draw(test, 50, 50);
    }
}

Upvotes: 0

Michael Laffargue
Michael Laffargue

Reputation: 10304

Your code is a total mess. Here is something you might want to look out : Painting pixels images in Java

And here are the problems :

  • private void LadderSnack() I think this should be the constructor so should be written private LadderSnack()

  • Your Runnable implementation should be thought again. Avoid using while(true){} but rather use while(true) {Thread.sleep(xxx)} to avoid your application to freeze.

  • You create a pixels array of random values but then use pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); which override your values with whatever is in the databuffer.

  • You never use your pixels array.

  • I think you should review the whole concept.

Upvotes: 1

Related Questions