【问题标题】:How does the BufferedImage.getRGB(int, int, int, int, int[], int, int) work?BufferedImage.getRGB(int, int, int, int, int[], int, int) 是如何工作的?
【发布时间】:2014-04-06 03:12:42
【问题描述】:

所以我一直在关注 youtube 上的游戏编程教程,然后弹出了以下代码: bufferedImageObject.getRGB(int, int, int, int, int[], int, int); 给出的解释是,基本上, .getRGB() 将 bufferedImageObject 的像素数据设置为您通过方法参数传递的 int[]。

所以,这是我的问题:这到底是如何工作的?就像,显然 getRGB 方法修改了 int[] 对吗?我尝试在测试程序中这样做,但没有任何改变。那么,getRGB 方法究竟是如何将数据存储到传入的 int[] 数组中的呢?最重要的是,这有什么限制?我从来没有遇到过这种事情,但我可以看到无限的可能性!

感谢您的任何见解,请随时编辑我的问题,因为我不擅长措辞问题!

编辑: 这是一个我刚刚测试过这个想法的程序:

public class main {
    public static void main(String[] args) {
        int t = 10;
        test(t);
        System.out.println(t);
    }

    public static void test(int i) {
        i = 15;
    }
}

打印出来的值是“10”。那么,在这种情况下,我如何使用test() 方法修改t 变量?缺少t = test(t);,测试返回 15....

【问题讨论】:

  • 这正是它应该如何工作的。查看源代码,该方法使用您传入的数组,除非它是null(在这种情况下它自己创建一个数组)。如果你发布你的测试程序会很有帮助,也许那里发生了一些事情。
  • 虽然没有具体回答我的问题。我已经完成了一些 c++,并且我知道您可以通过方法传递变量,并且该方法(无论是否在另一个类中)都可以修改实际变量本身,从而更改调用变量的值。我不知道java会这样做,我想知道如何强制它这样做?就像,这种方法显然可以,但是如何?它只适用于数组吗?
  • 您作为参数传递的int[] 是否足够大以容纳所有值?我认为这一行是该方法所做的最有用的信息: (x, y) 处的 RGB 值是:pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)];
  • 是的。但是,所以,如果你传递一个 int[] 作为参数,你传递给它的方法可以修改原始变量吗?我想这就是我的问题......如果是的话,你能用任何变量做到这一点吗?如果没有,你会怎么做?
  • Java 使用“按值传递”,这让很多人感到困惑。 Java中的所有对象实际上都是指针,所以当你传递一个指针的时,你可以修改这个指针所指向的值。数组是对象,因此您可以通过将数组作为参数传递来修改数组的内容。

标签: java arrays parameters rgb bufferedimage


【解决方案1】:

我认为这整个问题可能归结为您不了解 Java 的按值传递语义。

public static void main(String[] args) {
    int t = 10;
    test(t);
    System.out.println(t);
}

public static void test(int i) {
    i = 15;
}

那么,在这种情况下,如何使用test() 方法修改t 变量?缺少t = test(t);test 返回15

简单的答案是你不能。

你不能编写一个方法来修改另一个方法中的局部变量的值。这在 Java 中根本不可能。

就是为什么我们坚持说Java参数传递是“按值传递”。


回到你原来的问题,考虑到这个:

   bufferedImageObject.getRGB(int, int, int, int, int[], int, int);

问题:getRGB如何返回数组参数中的值?

答案:它将图像中的像素值复制到数组中。

问题:(仍然)如何传递值?

答案:被传递的参数(按值!!)是对数组的引用。 getRGB 正在修改数组。但它并没有修改数组引用。


我尝试在测试程序中这样做,但没有任何改变。

在我解释之前,我需要>>查看

【讨论】:

  • 我认为这是混淆,但如果OP传递一个有效的int[]作为参数,它应该被适当地修改。
  • 老实说。我之前在将数组传递给库函数时遇到过问题。如果getRGB 方法中存在错误,我不会感到惊讶。如果是这样,您应该确保这是一个错误而不是您的错,如果是,请提交错误报告。但在你这样做之前,正如我最初建议的那样,你应该确保你完全理解文档:pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)];
  • 如果 getRGB 中仍然存在错误,我会非常感到惊讶。 BufferedImage 类自 Java 1.2 以来就已经存在,而在此之前,错误很可能已经出现在成千上万其他人的代码中。
  • 我希望我所说的“该死的确定”它一个错误的部分暗示了我怀疑存在错误的事实。
  • 这个答案太棒了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2018-01-13
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多