我只需要一个可以在其中绘制的面板。我希望能够逐个像素地绘制。
ps:我不需要其他原语的线条/圆圈。pps:图形库无所谓,可以是awt、swing、qt..什么的。我只想拥有通常由 Bufferedimage 或类似设置单个像素颜色然后将其渲染到屏幕的东西。
一种方法的示例:
// Create the new image needed
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );
for ( int rc = 0; rc < height; rc++ ) {
for ( int cc = 0; cc < width; cc++ ) {
// Set the pixel colour of the image n.b. x = cc, y = rc
img.setRGB(cc, rc, Color.BLACK.getRGB() );
}//for cols
}//for rows
然后从被覆盖的paintComponent(Graphics g)中
((Graphics2D)g).drawImage(img, <args>)
由 Bufferedimage 表示。
我BufferedImage
为此建议一个,显示..
..或类似的设置单个像素的颜色,然后将其渲染到屏幕上。
..in a-JLabel
如this answer所示。
当然,一旦我们有了 的实例BufferedImage
,我们就可以setRGB(..)
.
如果你真的需要逐像素渲染,我已经为我为研究实验室编写的热点可视化软件做了详细的介绍。
你想要的是BufferedImage.setRGB(..) - 如果你是逐个像素地绘制,我假设你已经实现了一个算法,它将渲染每个像素的 RGB 值(就像我们对热图所做的那样) . 这是我们过去在兼容 IE 的旧 Applet 中使用的。像魅力一样工作,并且考虑到它正在做的事情,速度相对较快。
不幸的是,任何时候您直接在 BufferedImage 中操作 RGB 值时,它都会被支持的视频内存取消缓存。
不过从 Java 7 开始,我听说底层 J2D 实现将尝试在操作停止并且一遍又一遍地完成渲染时将图像重新缓存到视频内存中——例如,当你渲染热量时map 它不会加速,但是一旦渲染,当您拖动窗口并使用应用程序时,支持图像数据可以重新加速。
如果您想快速做某事,您可以使用图形方法 setColor 和 drawLine。例如:
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Set the colour of pixel (x=1, y=2) to black
g.setColor(Color.BLACK);
g.drawLine(1, 2, 1, 2);
}
我已经使用了这种技术,而且速度不是很慢。我没有将它与使用 BufferedImage 对象进行比较。
这里有点晚了,但你总是可以像 Java 游戏程序员那样做,有一个Screen
类:
public class Screen {
private int width, height;
public int[] pixels;
public Screen(int width, int height) {
this.width = width;
this.height = height;
pixels = new int[width * height];
}
public void render() {
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
pixels[x + y * width] = 0xFFFFFF; //make every pixel white
}
}
}
public void clear() {
for(int i = 0; i < pixels.length; i++) {
pixels[i] = 0; //make every pixel black
}
}
}
然后在你的主要课程中:
private Screen screen;
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
public void render() {
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
screen.clear();
screen.render();
for(int i = 0; i < pixels.length; i++) {
pixels[i] = screen.pixels[i];
}
Graphics g = bs.getDrawGraphics();
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
g.dispose();
bs.show();
}
我认为这应该可行。