我已经定义了一个颜色模块,该模块对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()
}
}
我在两个问题上遇到困难:
如何在数组上执行该操作?
如何在模块颜色中实现returnRGB()方法?
将感谢您的帮助, 谢谢
答案 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;
}
在这里,我们使用offset
,offset + 1
和offset + 2
来指出以下事实:红色放在第一位,绿色放在第二位,蓝色放在第三位。
此外,您还必须传递红色,绿色,蓝色作为参数。
可以使用...
符号完成使用System.arraycopy的setRGB的有趣版本,因此它显示为一行代码:
public void setRGB(byte[] dest, int offset, byte... values) {
System.arraycopy(values, 0, dest, offset, values.length());
}