如何在循环中设置数组RGB值的3个连续位置

时间:2019-05-08 12:19:43

标签: java arrays

我已经定义了一个颜色模块,该模块对RGB向量进行一些基本操作。

在对每个像素的RGB值应用一些操作后,我试图在Java中导出图像。我有一个数组,其大小为:height * width,它在一个循环中对其进行迭代,该代码段执行了以下操作:

byte[] rgbData = new byte[this.imageWidth * this.imageHeight * 3];
for (int x = 0; x < this.imageWidth; x++) {
    for (int y = 0; y < this.imageHeight; y++) {
        Color color=this.scene.getPixelColor(x, y, this.imageWidth, this.imageHeight);
        rgbData[(y * this.imageWidth + x) * 3] = color.getRedByte();
        rgbData[(y * this.imageWidth + x) * 3 + 1] = color.getGreenByte();
        rgbData[(y * this.imageWidth + x) * 3 + 2] = color.getBlueByte();

    }
}

我正在尝试在一行中设置所有3个RGB值。 类似于(只是一个伪代码):

byte[] rgbData = new byte[this.imageWidth * this.imageHeight * 3];
for (int x = 0; x < this.imageWidth; x++) {
    for (int y = 0; y < this.imageHeight; y++) {
        Color color=this.scene.getPixelColor(x, y, this.imageWidth, this.imageHeight);
        rgbData[(y * this.imageWidth + x) * 3 <0:2>] =color.returnRGB()
    }
}

我在两个问题上遇到困难:

  1. 如何在数组上执行该操作?

  2. 如何在模块颜色中实现returnRGB()方法?

将感谢您的帮助, 谢谢

2 个答案:

答案 0 :(得分:2)

在Java中,惯用的方法是从const和其他产生数组结果的常用方法中获取线索。

您的InputStream.read(buf,off,len)方法如下:

returnRGB

然后您这样称呼它:

Color
{
...
    public void getRGBBytes(byte[] dest, int offset)
    {
        dest[offset++] = redValue;
        dest[offset++] = greenValue;
        dest[offset] = blueValue;
    }
}

这种样式通常在性能很重要的地方使用,因为它避免了创建临时对象。在通常情况下,使用原始数组的情况都是相同的,因此应适当注意。

但是,我应该提到,通常也可以在不创建临时对象的情况下实现图像处理循环-您需要为每个像素获取一个颜色对象,这会使该循环的速度慢得多。

在您用于color.getRGBBytes(rgbdata, (y * this.imageWidth + x) * 3); 的任何类中实现此方法都将更加高效,因此您可以这样做,并且完全避免创建临时对象:

scene

答案 1 :(得分:1)

如果颜色表示为int [R,G,B]数组,则可以使用方法System.arraycopy在另一个数组中复制值数组:

  

从指定的源数组(从指定位置开始)复制数组到目标数组的指定位置。数组组件的子序列从src引用的源数组复制到dest引用的目标数组。复制的组件数等于length参数。将源数组中srcPos到srcPos + length-1位置上的分量分别复制到目标数组的destPos到destPos + length-1位置。

这里的问题是您使用的是不提供此类功能的Color类(可能与python中的等效实现不同),因此您需要使用不同的方法访问每种颜色,并且您无法执行只需一行就可以完成,而无需创建不必要的int数组并使用它来做到这一点。

另一种可能与马特(Matt)所写但在语法上正确的可能性是

public void setRGB(byte[] dest, int offset, byte red, byte green, byte blue) {
    dest[offset] = red;
    dest[offset + 1] = green;
    dest[offset + 2] = blue;
}

在这里,我们使用offsetoffset + 1offset + 2来指出以下事实:红色放在第一位,绿色放在第二位,蓝色放在第三位。

此外,您还必须传递红色,绿色,蓝色作为参数。

可以使用...符号完成使用System.arraycopy的setRGB的有趣版本,因此它显示为一行代码:

public void setRGB(byte[] dest, int offset, byte... values) {
    System.arraycopy(values, 0, dest, offset, values.length());
}