设置BufferedImage的单个像素会在另一个BufferedImage中设置相同的像素。为什么?

时间:2014-08-03 00:39:11

标签: 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) {
        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'表示BufferedImage a和BufferedImage b相同。看到我以相同的方式生成它们直到行开始' a.setRG(....'使BufferedImage变得不同,我不希望输出。如果我开始循环代码,这会变得更糟像这样,但特别是每次生成输出BufferedImage的代码都不同,这正是我在上述项目中所做的。

提前感谢您提供的任何帮助。

另外,这是我在这里发布的第二个问题,所以请说出来,如果我做得不对。

干杯。

1 个答案:

答案 0 :(得分:2)

    BufferedImage a = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
    BufferedImage b = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);

上面的代码行什么都不做,因为在以下两行代码中你重置了" a"和" b"变量到Util.GenOriginBlue()方法返回的值。

    a = Util.genOriginBlue();
    b = Util.genOriginBlue();

然后在您的Util类中使用:

static BufferedImage oB;

这意味着您将只拥有BufferedImage的单个实例。因此,代码中的if语句只会执行一次,然后第二次调用该方法时,只需返回对BufferedImage的相同引用。

您需要在Util.genOriginBlue()方法中创建BufferedImage的新实例。所以摆脱静态" ob"变量并删除if语句。然后,当您创建BufferedImage时,它将是相同的,但您可以单独更改像素。