Java 设置BuffereImage的单个像素将在另一个BuffereImage中设置相同的像素。为什么?
我在编写另一个项目时遇到了这个问题,但我已经将代码简化为直接受到上述问题影响的代码 EntryPoint.javaJava 设置BuffereImage的单个像素将在另一个BuffereImage中设置相同的像素。为什么?,java,memory,bufferedimage,behavior,Java,Memory,Bufferedimage,Behavior,我在编写另一个项目时遇到了这个问题,但我已经将代码简化为直接受到上述问题影响的代码 EntryPoint.java package replaced.with.real.package.in.code.at.compile.time; import java.awt.image.BufferedImage; import java.util.Random; public class EntryPoint { public static void main(String[] args
package replaced.with.real.package.in.code.at.compile.time;
import java.awt.image.BufferedImage;
import java.util.Random;
public class EntryPoint {
public static void main(String[] args) {
BufferedImage a = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
BufferedImage b = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
a = Util.genOriginBlue();
b = Util.genOriginBlue();
a.setRGB(new Random(0L).nextInt(500), new Random(1L).nextInt(500), 0xffffff);
System.out.println(a == b);
}
}
Util.java
package replaced.with.real.package.in.code.at.compile.time;
import java.awt.image.BufferedImage;
public class Util
{
static BufferedImage oB;
public static BufferedImage genOriginBlue()
{
if(oB == null)
{
oB = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
oB.setRGB(0, 0, 1, 1, new int[] {255}, 0, 1);
}
return oB;
}
}
这将打印“true”,表示BuffereImage a和BuffereImage b相同。正如我以相同的方式生成它们,直到使BuffereImage不同的行开始“a.setRG(..”,我不会期望输出。如果我开始这样循环代码,情况会变得更糟,但尤其是每次生成输出BuffereImage的代码都不同,这正是我在上述项目中所做的
提前感谢您提供的任何帮助
另外,这是我在这里发布的第二个问题,如果我做得不对,请说出来
干杯
BufferedImage a = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
BufferedImage b = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
上面的代码行没有任何作用,因为在下面的两行代码中,您将“a”和“b”变量的值重置为Util.GenOriginBlue()方法返回的值
然后在Util类中使用:
static BufferedImage oB;
这意味着您将只拥有BuffereImage的一个实例。因此,代码中的if语句将只执行一次,然后在第二次调用该方法时,您只返回对BuffereImage的相同引用
您需要在Util.genOriginBlue()方法中创建BuffereImage的新实例。因此,请去掉静态“ob”变量并去掉if语句。这样,创建BuffereImage时,您的BuffereImage将是相同的,但您可以单独更改像素。尝试
.equals()
在第一个选项中。@BitNinja测试后,它会产生相同的输出。也就是说,如果您引用的是“System.out.println(a==b)”,并建议它应该是“System.out.println(a.equals(b))'。我很感谢您的帮助,这解决了部分问题。第二部分仍然存在:在我的更大的项目中,使用类似的代码段,我做了比设置单个像素更高级的事情。例如,绘制一些高级2D几何体。我以同样的方式,每秒50次。所有这些几何体项目都需要一段时间来渲染t-so-beefy computer,我真的只想在程序执行过程中执行一次这样的任务,而不是频繁地执行。在后一种情况下,我最终会重复执行同样的、资源密集型的任务。提前感谢所有寻求提示的人。
static BufferedImage oB;