【问题标题】:Why can't I change this BufferedImage?为什么我不能更改这个 BufferedImage?
【发布时间】:2015-01-11 06:35:09
【问题描述】:

出于某种原因,我可以使用 setRGB 更改缓冲图像,但不能使用光栅中的实际 int 数组:

这行得通

BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);

for (int y = 0; y < 32; y++) {
    for (int x = 0; x < 32; x++) {
        int gray = (int) (MathUtil.noise(x, y) * 255); //I have tested the noise function,   and know it works fine
        img.setRGB(x, y, gray << 16 | gray << 8 | gray);
    }
}

这不是

BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
int[] data = ((DataBufferInt) img.getData().getDataBuffer()).getData();

for (int y = 0; y < 32; y++) {
    for (int x = 0; x < 32; x++) {
        int gray = (int) (MathUtil.noise(x, y) * 255); //I have tested the noise function, and know it works fine
        data[x + y * 32] = gray << 16 | gray << 8 | gray;
    }
}

噪声函数:

public static float noise(int x, int y) {
    int n = x + y * 57;
    n = (n << 13) ^ n;
    return Math.abs((1.0f - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f));
}

编辑

没关系,我修好了。我需要使用 getRaster :P

【问题讨论】:

  • @5gon12eder 没有错误,图像应该是不连贯的噪声,但结果是黑色的
  • 你为什么要重新发明轮子(通过你的noise函数)?
  • @specializt 因为我在java中没有找到真正做到这一点的方法(每次都没有初始化一个新的随机数)
  • 嗯...这就是他们的关键字static final 是为了...
  • @specializt "如果没有这种技能,程序员可能永远不会成为开发人员" 抱歉,但我有我的应用程序的确切目标。我想在我创建它之前我已经知道我将要使用这个方法。我知道它会满足我的需求,并且不会妨碍我成为一名开发人员。

标签: java bufferedimage


【解决方案1】:

因为当您调用 BufferedImage.getData() 时,它会返回一个副本,而不是实际的后备数组。因此,您直接对该数组所做的任何更改都不会反映在图像中。

来自JavaDoc for BufferedImage.getData()

返回: 作为图像数据副本的 Raster。

编辑 有趣的是它在Java 6 JavaDoc 中对相同方法的说明,它更明确地说明了副本的效果。我想知道他们为什么改变它?

将图像作为一个大图块返回。返回的 Raster 是图像数据的副本,如果图像更改,则不会更新

【讨论】:

  • 什么?它从来没有这样工作过!我发誓我已经这样做了很多年了!
  • 是的,那个似乎是在调用getRaster() 而不是getData()。也许就是这样?
  • 哈哈,我觉得我们的cmets越过了。恭喜你弄明白了!祝你好运。
  • @Todd 也许他们改变了它,因为“返回的栅格是图像数据的副本,如果图像被改变,则不会更新”在语法上没有意义。
【解决方案2】:

答案是否可以像 img 对象中没有反映数据数组中的更改一样简单?

【讨论】:

  • 也许吧,但它从来没有这样做过,所以我很困惑。我还有 java 7
  • @Todd 提供了我刚才所说的更具技术性的版本,但获取数据仅返回一个副本,因此您必须将该数据数组转回 BufferedImage 以查看更改跨度>
  • 事情是,我以前总是这样做,它会反映它自己的变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多