【问题标题】:BufferedImage.getRGB method not consistent - Java AWTBufferedImage.getRGB 方法不一致 - Java AWT
【发布时间】:2012-04-13 18:29:21
【问题描述】:

我正在使用 Applet 编写一个小游戏。我希望能够检查屏幕上像素的颜色。但是,当我在游戏循环(反复执行的 while 循环)中对缓冲图像使用 .getRGB() 时,即使像素颜色实际上从未改变,它也会给我不一致的值!

例如,如果我用绿色填充图像并在屏幕中间的像素上调用 .getRGB() 有时它会给我 0xFF00FF00(绿色)作为颜色,有时它给我 0xFF000000(黑色) 即使颜色始终保持绿色!

有什么帮助吗?

如果有帮助,这里是相关代码,我已将其最小化以专注于问题:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class t extends Applet implements Runnable {
    Graphics2D      bufferG;
    BufferedImage   bufferI;
    final int       WIDTH   = 500, HEIGHT = 500;
    public void init() {
        setSize(WIDTH, HEIGHT);
        bufferI = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        bufferG = bufferI.createGraphics();
        (new Thread(this)).start();
    }
    public void run() {
        while (true){
            if (bufferI.getRGB(WIDTH/2, HEIGHT/2)==0xFF000000) System.out.println("BLACK");
        }
    }
    public void paint(Graphics g) {
        bufferG.setColor(Color.green);
        bufferG.fillRect(0, 0, WIDTH, HEIGHT);

        g.drawImage(bufferI, 0, 0, this);
    }
}

【问题讨论】:

  • 这是一种猜测我的代码在做什么的问题,这让我认为你在错误的论坛上发布了它。尝试发布代码并提供问题的详细描述和您的调试尝试,或尝试大厅下方的千里眼论坛 - 以您更好的运气为准!
  • @Hovercraft SSCCE 发布为编辑(和答案)。

标签: java graphics applet awt


【解决方案1】:

我不确定您为什么要处理缓冲区。这会将图像绘制为绿色并且在命令行上不产生任何输出(将颜色报告为黑色)。

// <applet code='t' width=400 height=200></applet>
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class t extends Applet implements Runnable {

    BufferedImage   bufferI;
    final int       WIDTH   = 500, HEIGHT = 500;
    public void init() {
        bufferI = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferI.getGraphics();
        g.setColor(Color.GREEN);
        g.fillRect(0,0,WIDTH,HEIGHT);
        g.dispose();
        (new Thread(this)).start();
    }
    public void run() {
        while (true){
            if (bufferI.getRGB(WIDTH/2, HEIGHT/2)==0xFF000000) System.out.println("BLACK");
        }
    }
    public void paint(Graphics g) {
        g.drawImage(bufferI, 0, 0, this);
    }
}

注意事项

编译运行

prompt> javac t.java
prompt> appletviewer t.java  // yes that file extension is correct.

尺寸

applet 的大小在加载它的 HTML 中设置,不应尝试设置自己的大小。

【讨论】:

  • 我使用缓冲区进行双缓冲,否则当您制作动画时,图像会疯狂闪烁。我不确定我这样做的方式是否是最优化的,但这是我学会的方式。谢谢你的反馈!我的预感是 while 循环在缓冲图像完全绘制之前调用 getRGB ——这就是黑色的来源,因为这些像素还没有被填充。我试图找到一种方法来解决这个问题,要么通过某种方式确保图像被完全绘制,要么通过检索屏幕上显示的实际图像对象。
  • “我使用缓冲区进行双缓冲” 请注意,Swing(例如以JApplet 开头)默认具有双缓冲。 OTOH 使用 Swing AWT 将单个图像直接绘制到绘图中的图形对象时,我从未见过任何闪烁。
  • 是的,我认为这是我从 awt 转到 Swing 的好时机。 >_
  • “只有当你尝试为某些东西设置动画时才会闪烁,比如让一个圆圈在屏幕上移动。” 是的,我指的是动画,我做过一个他们中的几个(几十个) - 帮助了数百人。您可以在 my Tube channel 的“音乐视频”和“StarZoom/Wiggly Worms 预览”中看到我的一些动画示例。
  • 再次感谢您的帮助。显然我还有很多东西要学,但是我用来在 AWT 中为对象设置动画的方法是更新它在 while 循环中的位置,并为该循环的每次迭代调用一次重绘。如果我不使用缓冲区,这会导致闪烁。
猜你喜欢
  • 2011-04-26
  • 2013-11-08
  • 2015-03-24
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2017-02-18
相关资源
最近更新 更多