Java 绘制/显示电视噪音-黑白像素在全屏上随机闪烁

Java 绘制/显示电视噪音-黑白像素在全屏上随机闪烁,java,graphics,Java,Graphics,可能会得到类似的效果 在爪哇?我们的目标是让它尽快,-我的任务是找出是否有可能以这种方式烧录我的lcd中的像素。这听起来可能很可笑,但我仍然需要找出答案。Spektre共享的链接说16级灰度就足够了,因此您可以在[0,15]范围内生成一个随机值,并将其相乘得到一个像素值 因为您关心速度,所以可以直接操纵a的速度来更新像素。保证图像具有ComponentColorModel和ComponentSampleModel: import java.awt.Dimension; import java.

可能会得到类似的效果


在爪哇?我们的目标是让它尽快-我的任务是找出是否有可能以这种方式烧录我的lcd中的像素。这听起来可能很可笑,但我仍然需要找出答案。

Spektre共享的链接说16级灰度就足够了,因此您可以在[0,15]范围内生成一个随机值,并将其相乘得到一个像素值

因为您关心速度,所以可以直接操纵a的速度来更新像素。保证图像具有ComponentColorModel和ComponentSampleModel:

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsDevice;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferUShort;
import java.awt.image.ComponentSampleModel;

import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

import java.util.Random;

public class NoiseGenerator
extends JPanel {
    private static final long serialVersionUID = 1;

    private static final int FPS = Math.max(1, Integer.getInteger("fps", 30));

    private final int width;
    private final int height;

    private final BufferedImage image;

    private final Random random = new Random();

    public NoiseGenerator(GraphicsDevice screen) {
        this(screen.getDefaultConfiguration().getBounds().getSize());
    }

    public NoiseGenerator(Dimension size) {
        this(size.width, size.height);
    }

    public NoiseGenerator(int width,
                          int height) {
        this.width = width;
        this.height = height;

        this.image = new BufferedImage(width, height,
            BufferedImage.TYPE_USHORT_GRAY);

        setFocusable(true);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    private void generateFrame() {
        DataBufferUShort buffer = (DataBufferUShort)
            image.getRaster().getDataBuffer();
        short[] data = buffer.getData();

        ComponentSampleModel sampleModel = (ComponentSampleModel)
            image.getSampleModel();
        int stride = sampleModel.getScanlineStride();

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                data[y * stride + x] = (short) (random.nextInt(16) * 4096);
            }
        }
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }

    public void start() {
        Timer timer = new Timer(1000 / FPS, e -> generateFrame());
        timer.start();
    }

    public static void main(String[] args) {
        int screenNumber = args.length > 0 ? Integer.parseInt(args[0]) : -1;

        EventQueue.invokeLater(() -> {
            GraphicsEnvironment env =
                GraphicsEnvironment.getLocalGraphicsEnvironment();

            GraphicsDevice screen = env.getDefaultScreenDevice();

            if (screenNumber >= 0) {
                GraphicsDevice[] screens = env.getScreenDevices();
                if (screenNumber >= screens.length) {
                    System.err.println("Cannot detect screen " + screenNumber);
                    System.exit(2);
                }
                screen = screens[screenNumber];
            }

            NoiseGenerator generator = new NoiseGenerator(screen);
            generator.start();

            JFrame window = new JFrame("Noise Generator",
                screen.getDefaultConfiguration());
            window.setUndecorated(true);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            generator.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    System.exit(0);
                }
            });
            generator.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent event) {
                    System.exit(0);
                }

                @Override
                public void keyPressed(KeyEvent event) {
                    if (event.getKeyCode() == KeyEvent.VK_ESCAPE) {
                        System.exit(0);
                    }
                }
            });
            window.getContentPane().add(generator);
            screen.setFullScreenWindow(window);
        });
    }
}
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.GraphicsEnvironment;
导入java.awt.GraphicsDevice;
导入java.awt.image.buffereImage;
导入java.awt.image.DataBufferUShort;
导入java.awt.image.ComponentSampleModel;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseAdapter;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入java.util.Random;
公共类噪声发生器
扩展JPanel{
私有静态最终长serialVersionUID=1;
私有静态final int FPS=Math.max(1,Integer.getInteger(“FPS”,30));
私有最终整数宽度;
私人最终整数高度;
私有最终缓冲图像;
私有最终随机=新随机();
公共噪声发生器(图形设备屏幕){
这(screen.getDefaultConfiguration().getBounds().getSize());
}
公共噪声发生器(尺寸){
这(尺寸、宽度、尺寸、高度);
}
公共噪声发生器(整数宽度,
整数高度){
这个。宽度=宽度;
高度=高度;
this.image=新的缓冲区图像(宽度、高度、,
BuffereImage.TYPE_-USHORT_-GRAY);
设置聚焦(真);
}
@凌驾
公共维度getPreferredSize(){
返回新尺寸(宽度、高度);
}
私有void generateName(){
数据缓冲区=(数据缓冲区)
image.getRaster().getDataBuffer();
short[]data=buffer.getData();
ComponentSampleModel sampleModel=(ComponentSampleModel)
getSampleModel();
int stride=sampleModel.getScanlineStride();
对于(int y=0;ygenerateFrame());
timer.start();
}
公共静态void main(字符串[]args){
int screenNumber=args.length>0?整数。parseInt(args[0]):-1;
EventQueue.invokeLater(()->{
图形环境=
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice screen=env.getDefaultScreenDevice();
如果(屏幕编号>=0){
GraphicsDevice[]screens=env.getScreenDevices();
如果(屏幕编号>=屏幕长度){
System.err.println(“无法检测屏幕”+屏幕编号);
系统出口(2);
}
屏幕=屏幕[屏幕编号];
}
噪声发生器=新的噪声发生器(屏幕);
generator.start();
JFrame窗口=新JFrame(“噪声发生器”,
screen.getDefaultConfiguration());
窗口。设置未装饰(真实);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
generator.addMouseListener(新的MouseAdapter(){
@凌驾
公共void mouseClicked(MouseEvent事件){
系统出口(0);
}
});
generator.addKeyListener(新的KeyAdapter(){
@凌驾
public void keyTyped(KeyEvent事件){
系统出口(0);
}
@凌驾
按下公共无效键(KeyEvent事件){
if(event.getKeyCode()==KeyEvent.VK_ESCAPE){
系统出口(0);
}
}
});
window.getContentPane().add(生成器);
screen.setFullScreenWindow(窗口);
});
}
}

Spektre共享的链接说16级灰度就足够了,因此您可以生成[0,15]范围内的随机值,并将其相乘以获得像素值

因为您关心速度,所以可以直接操纵a的速度来更新像素。保证图像具有ComponentColorModel和ComponentSampleModel:

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsDevice;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferUShort;
import java.awt.image.ComponentSampleModel;

import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

import java.util.Random;

public class NoiseGenerator
extends JPanel {
    private static final long serialVersionUID = 1;

    private static final int FPS = Math.max(1, Integer.getInteger("fps", 30));

    private final int width;
    private final int height;

    private final BufferedImage image;

    private final Random random = new Random();

    public NoiseGenerator(GraphicsDevice screen) {
        this(screen.getDefaultConfiguration().getBounds().getSize());
    }

    public NoiseGenerator(Dimension size) {
        this(size.width, size.height);
    }

    public NoiseGenerator(int width,
                          int height) {
        this.width = width;
        this.height = height;

        this.image = new BufferedImage(width, height,
            BufferedImage.TYPE_USHORT_GRAY);

        setFocusable(true);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    private void generateFrame() {
        DataBufferUShort buffer = (DataBufferUShort)
            image.getRaster().getDataBuffer();
        short[] data = buffer.getData();

        ComponentSampleModel sampleModel = (ComponentSampleModel)
            image.getSampleModel();
        int stride = sampleModel.getScanlineStride();

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                data[y * stride + x] = (short) (random.nextInt(16) * 4096);
            }
        }
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }

    public void start() {
        Timer timer = new Timer(1000 / FPS, e -> generateFrame());
        timer.start();
    }

    public static void main(String[] args) {
        int screenNumber = args.length > 0 ? Integer.parseInt(args[0]) : -1;

        EventQueue.invokeLater(() -> {
            GraphicsEnvironment env =
                GraphicsEnvironment.getLocalGraphicsEnvironment();

            GraphicsDevice screen = env.getDefaultScreenDevice();

            if (screenNumber >= 0) {
                GraphicsDevice[] screens = env.getScreenDevices();
                if (screenNumber >= screens.length) {
                    System.err.println("Cannot detect screen " + screenNumber);
                    System.exit(2);
                }
                screen = screens[screenNumber];
            }

            NoiseGenerator generator = new NoiseGenerator(screen);
            generator.start();

            JFrame window = new JFrame("Noise Generator",
                screen.getDefaultConfiguration());
            window.setUndecorated(true);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            generator.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    System.exit(0);
                }
            });
            generator.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent event) {
                    System.exit(0);
                }

                @Override
                public void keyPressed(KeyEvent event) {
                    if (event.getKeyCode() == KeyEvent.VK_ESCAPE) {
                        System.exit(0);
                    }
                }
            });
            window.getContentPane().add(generator);
            screen.setFullScreenWindow(window);
        });
    }
}
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.GraphicsEnvironment;
导入java.awt.GraphicsDevice;
导入java.awt.image.buffereImage;
导入java.awt.image.DataBufferUShort;
导入java.awt.image.ComponentSampleModel;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseAdapter;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入java.util.Random;
公共类噪声发生器
扩展JPanel{
私有静态最终长serialVersionUID=1;
私有静态final int FPS=Math.max(1,Integer.getInteger(“FPS”,30));
私有最终整数宽度;
私人最终整数高度;
私有最终缓冲图像;
私有最终随机=新随机();
公共噪声发生器(图形设备屏幕){
这(screen.getDefaultConfiguration().ge