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