所以,我要做的是运行一张1024x768的图片(或者,popMap。getWidth x popMap.getHeight),抓取它的蓝色,将它与目前为止最高的蓝色进行比较,如果它更多,那个蓝色就会变成新的newBlue。基本上,找到图像中最高的蓝色值,最接近255的蓝色。
另外,我试图将整个事物的蓝色值存储到数组popMapArray中,这是一个具有3列的2d数组,存储[blueValue][x][y]。然后我将排序,得到一个从高到低的最蓝值的列表。
我的问题是,使用下面的代码,它只在column=767时存储到数组中。
我得到1024 [blue,row,767],然后剩下的都是[0,0,0]
知道为什么吗?Java,顺便说一下。
for (int row = 0; row < popMap.getWidth(); row++)
{
for (int column = 0; column < popMap.getHeight(); column++)
{
System.out.println(column);
//Find a Pixel
int c = popMap.getRGB(row, column);
int red = (c & 0x00ff0000) >> 16;
//int green = (c & 0x0000ff00) >> 8;
//int blue = c & 0x000000ff;
// and the Java Color is ...
Color color = new Color(red);
int newBlue = color.getBlue();
int oldBlue = lastColor.getBlue();
switch(popArrayRow)
{
case 0:
{
arrayVar = newBlue;
popArrayRow = 1;
break;
}
case 1:
{
arrayVar = row;
popArrayRow = 2;
break;
}
case 2:
{
arrayVar = column;
popArrayRow = 0;
break;
}
}
popArray[row][popArrayColumn] = arrayVar;
//System.out.println(popArray[row][popArrayColumn]);
switch(popArrayColumn)
{
case 0:
{
popArrayColumn = 1;
break;
}
case 1:
{
popArrayColumn = 2;
break;
}
case 2:
{
popArrayColumn = 0;
break;
}
}
if(newBlue > oldBlue)
{
startX = row;
startY = column;
//System.out.print(row);
//System.out.print(",");
//System.out.println(column);
System.out.print("The oldBlue is ");
System.out.println(oldBlue);
lastColor = color;
}
}
}
int red = (c & 0x00ff0000) >> 16;
//int green = (c & 0x0000ff00) >> 8;
//int blue = c & 0x000000ff;
// and the Java Color is ...
Color color = new Color(red);
int newBlue = color.getBlue();
你是说"Color Color = new Color(c)"吗?您的newBlue值将始终为0…
还有,你到底想用popArray构造做什么?让你的状态变量每像素调整一次可能并不能达到你想要的效果。听起来你想要一个SortedMap<int,Point>
,键在blueValue上,它的值是点的x、y坐标(存储为数组或Point对象)。然后你就有了你的数据结构,按蓝色值排序,你可以直接读取你的点。
您没有显示popArray
的声明(以及其他一些变量,我假设是初始化为0的整型)。您将其描述为"具有3列的2d数组"。我猜你已经声明它为int[1024][3]
,所以它在popMap
中每行有一行,然后你的3个"列"意味着存储蓝色值,原始x坐标和原始y坐标。
所以首先不清楚如何在这个数组中为原始图像中的每个像素存储一个条目。但也许我对你如何声明的猜测是错误的。
在任何情况下,每次通过内循环时,您都需要设置
popArray[currentPixel] = {blueValue, origX, origY}
,而不是每次在循环中只分配三个值中的一个。比如你写的是
popArray[0][0] = blueValue //first iteration; blueValue from row 0 col 0
popArray[0][1] = 0 //second iteration; row from row 0 col 1
popArray[0][2] = 2 //third iteration; column from row 0 col 2
所以希望你已经看到有些东西是错误的,因为你正在填充应该与循环的不同迭代的值一起的"列"。更糟糕的是,您会在下一次内循环迭代时开始覆盖这些值(在row
增量之前将迭代总共768次):
popArray[0][0] = blueValue // fourth iteration; blueValue from row 0 col 4; overwrite value assigned on first iteration
etc...
与其使用3个具有不同含义的数组"列"来保存这些数据元素,不如创建一个类来保存这三个值,并清楚地说明它们是什么。popArray
将包含此对象类型。此外,我会让它成为一个List
而不是一个数组,因为它更灵活,你可以简单地在最后调用Collections.sort()
;或者@jsegal有一个很好的建议,即使用在插入项时进行排序的数据结构。哪一个更好可能取决于你以后想用它们做什么。