我知道他们已经有一些“优化循环”问题了,但我认为这个问题有点不同。
我有一个代码可以读取图像中的所有像素。 从每个像素我必须有RGB颜色,这也已经有效。 然后我必须检查绿色是否大于红色蓝色,这也有效。 当绿色比红色和蓝色更大时,它必须做点什么。 这一切都有效但是,目前它确实很慢。
我也知道为什么它很慢,因为嵌套循环必须进行数百万次检查, 这是我的代码:
for (int j = 0; j < 200; j++){
for (int k = 0; k < 200; k++){
Log.i("Pixel Value", "pixel x="+j +k + Integer.toHexString(bmp.getPixel(j, k)));
for (cGreen = 50; cGreen < 254; cGreen++){
for (cRed = 0; cRed < 254; cRed++){
for (cBlue = 0; cBlue < 254; cBlue++){
if (Color.rgb(cRed, cGreen, cBlue) == bmp.getPixel(j, k)){ // magic method
if ((cGreen > cRed)&&(cGreen > cBlue)){
// this pixel is some sort of green
aantal++;
}
}
}
}
}
}
}
j&amp; k变量是图像的大小。 而“aantal”是一个荷兰语,在英语中意为“数量”。
他们是否可以更快地制作此代码(针对程序)? 我尝试了很多东西,但结果并不好。
我也尝试过检查:
if (cGreen < cRed){
// skip the rest
}
因此,当cRed已经高于cGreen时,他可以跳过其余部分。 然后它更快,但远远不够快。
那么,他们是一种“智能”的方式来让这段代码更快地运行吗? 或者其他类型的颜色检查要快得多,或者是其他类型的“过滤器”。 希望你们能想到什么。
已经感谢了!
编辑: 我做了另一个跳过检查,程序现在需要4秒来检查每个像素,而不是6,但它必须是几个像素,在1秒内。
答案 0 :(得分:2)
我找到了一个修复程序,然而代码是完全改变的。
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.four_colors);
System.out.println("START");
int orgWidth = bmp.getWidth();
int orgHeight = bmp.getHeight();
//define the array size
int[] pixels = new int[orgWidth * orgHeight];
bmp.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight);
for (int y = 0; y < orgHeight; y++){
for (int x = 0; x < orgWidth; x++){
int index = y * orgWidth + x;
int R = (pixels[index] >> 16) & 0xff; //bitwise shifting
int G = (pixels[index] >> 8) & 0xff;
int B = pixels[index] & 0xff;
total++;
if ((G > R)&&(G > B)){
counter++;
// do something
}
}
}
我希望它也会帮助其他人。