BuffereImage.getRGB方法不一致-Java AWT

BuffereImage.getRGB方法不一致-Java AWT,java,graphics,applet,awt,Java,Graphics,Applet,Awt,我正在用Applet编写一个小游戏。我希望能够检查屏幕上像素的颜色。但是,当我在游戏循环(一个反复执行的while循环)的缓冲图像上使用.getRGB()时,即使像素颜色实际上从未改变,它也会给我不一致的值 例如,如果我在屏幕中间的一个像素上填充绿色,我调用GeTrgB.(有时),它会给我0xFFFFF00(绿色)作为颜色,有时它会给我0xFFFUNM00(黑色),即使颜色总是保持绿色! 有什么帮助吗 以下是相关代码,如果这有帮助的话,我将其最小化,只是为了关注问题: import java.a

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

例如,如果我在屏幕中间的一个像素上填充绿色,我调用GeTrgB.(有时),它会给我0xFFFFF00(绿色)作为颜色,有时它会给我0xFFFUNM00(黑色),即使颜色总是保持绿色! 有什么帮助吗

以下是相关代码,如果这有帮助的话,我将其最小化,只是为了关注问题:

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

我不知道你为什么要处理缓冲区。这会将图像绘制为绿色&在命令行上不生成输出(将颜色报告为黑色)

大小
小程序的大小是在加载它的HTML中设置的,它不应该尝试设置自己的大小。

我不知道为什么要处理缓冲区。这会将图像绘制为绿色&在命令行上不生成输出(将颜色报告为黑色)

大小
小程序的大小是在加载它的HTML中设置的,它不应该尝试设置自己的大小。

这是一种猜测我的代码在做什么的问题,这让我觉得你在错误的论坛上发布了它。尝试发布代码并提供问题的详细描述和调试尝试,或者尝试大厅下面的千里眼论坛——无论哪个会给你带来更好的运气@气垫船SSCCE以编辑和回答的形式发布。这是一种猜测我的代码在做什么的问题,这让我觉得你在错误的论坛发布了它。尝试发布代码并提供问题的详细描述和调试尝试,或者尝试大厅下面的千里眼论坛——无论哪个会给你带来更好的运气@气垫船SSCCE发布为编辑和应答。我使用缓冲区进行双缓冲,因为否则当你有动画时,图像会疯狂地闪烁。我不确定我做这件事的方式是否是最佳的,但这是我学会的方式。谢谢你的意见!我的直觉是,while循环在缓冲图像完全绘制之前调用getRGB,这就是黑色的来源,因为这些像素还没有填充。我试图找到一种方法来解决这个问题,或者通过某种方式确保图像完全绘制,或者通过检索屏幕上显示的实际图像对象。“我使用缓冲区进行双缓冲”注意Swing(例如从
JApplet
开始)默认具有双缓冲。OTOH我从未见过在使用Swing或AWT将单个图像直接绘制到paint中的图形对象时出现任何闪烁。是的,我认为这是我从AWT切换到Swing的好时机我认为只有当你尝试制作动画时才会出现闪烁,比如让一个圆圈在屏幕上移动。“只有当你尝试制作动画时才会出现闪烁,比如让一个圆圈在屏幕上移动。”是的,我指的是动画,我做过几(几十)个,帮助过数百人。您可以在“音乐视频”和“StarZoom/Wiggly蠕虫预览”中看到我的一些动画示例。再次感谢您的帮助。显然,我还有很多东西要学,但我在AWT中为对象设置动画的方法是更新其在while循环中的位置,并为该循环的每次迭代调用重新绘制。如果我不使用缓冲区,这会导致闪烁。我使用缓冲区进行双缓冲,因为否则当你有动画时,图像会疯狂地闪烁。我不确定我做这件事的方式是否是最佳的,但这是我学会的方式。谢谢你的意见!我的直觉是,while循环在缓冲图像完全绘制之前调用getRGB,这就是黑色的来源,因为这些像素还没有填充。我试图找到一种方法来解决这个问题,或者通过某种方式确保图像完全绘制,或者通过检索屏幕上显示的实际图像对象。“我使用缓冲区进行双缓冲”注意Swing(例如从
JApplet
开始)默认具有双缓冲。OTOH我从未见过在使用Swing或AWT将单个图像直接绘制到paint中的图形对象时出现任何闪烁。是的,我认为这是我从AWT切换到Swing的好时机我认为只有当你尝试制作动画时才会出现闪烁,比如让一个圆圈在屏幕上移动。“只有当你尝试制作动画时才会出现闪烁,比如让一个圆圈在屏幕上移动。”是的,我指的是动画,我做过几(几十)个,帮助过数百人。您可以在“音乐视频”和“StarZoom/Wiggly蠕虫预览”中看到我的一些动画示例。再次感谢您的帮助。显然,我还有很多东西要学,但我在AWT中为对象设置动画的方法是更新其在while循环中的位置,并为该循环的每次迭代调用重新绘制。如果不使用缓冲区,会导致闪烁。
// <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.