【问题标题】:Image of random pixels随机像素的图像
【发布时间】:2012-07-13 08:47:35
【问题描述】:

我正在尝试制作随机像素的图像。我写了这段代码,但没有用 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);
    }
}

在运行时

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

在 Screen.java 中 永远不会执行移动图像 我希望图像在框架中移动,作为制作动画和动画随机像素图像的步骤。请帮帮我。

【问题讨论】:

    标签: java image user-interface random


    【解决方案1】:

    您可能想使用我的 api:http://www.threadox.com/projects/random-image-api/ 您收到一个缓冲图像,然后只需将其绘制到画布上。

    【讨论】:

      【解决方案2】:

      您的代码一团糟。您可能需要注意以下几点:Painting pixels images in Java

      以下是问题:

      • private void LadderSnack()我认为这应该是构造函数所以应该写成private LadderSnack()

      • 应该重新考虑您的Runnable 实现。避免使用while(true){},而是使用while(true) {Thread.sleep(xxx)} 以避免您的应用程序冻结。

      • 您创建了一个随机值的 pixels 数组,然后使用 pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 用数据缓冲区中的任何内容覆盖您的值。

      • 你永远不会使用你的 pixels 数组。

      • 我认为您应该回顾一下整个概念。

      【讨论】:

        【解决方案3】:

        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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-07
          • 2015-08-10
          • 2020-10-03
          • 2018-10-10
          • 1970-01-01
          • 2022-07-10
          • 1970-01-01
          • 1970-01-01
          • 2021-04-15
          相关资源
          最近更新 更多