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

标签 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,这正是我在上述项目中所做的。

预先感谢您提供的任何帮助。

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

干杯。

最佳答案

    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 在您创建时将是相同的,但您将能够单独更改像素。

关于java - 设置 BufferedImage 的单个像素会在另一个 BufferedImage 中设置相同的像素。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100611/

相关文章:

java - reshape bufferedImage 并将 double 值存储在 txt 中

arrays - 如何在Java中将byte []转换为BufferedImage?

java - 确定对象类型然后从 Snake yaml.load(InputStream) 转换对象的方法

java - Hadoop 类未找到异常

c# : simulate memory leaks

java - jProfiler 需要多少内存来分析大小为 X 的堆转储?

java - 如何轻松更新Json文件的单个属性

java - Gradle Output Jar 没有 Main-Class

python 在没有堆栈跟踪的情况下死于 Windows

Java BufferedImage 不工作