我总结数字的特殊情况涉及表示为整数的颜色。 Java函数BufferedImage.getRGB
以0x00RRGGBB
格式返回图像。我正在制作一个功能,为您提供图像上的灰度(颜色无关)颜色总和。目前,我的操作看起来很幼稚:
//Just a pseudocode
int sum = 0;
for(x->width) {
for(y->height) {
int pixel = image.getRGB(x,y);
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
}
}
//The average value for any color then equals:
float avg = sum/(width*height*3);
我想知道我是否可以通过一些位移逻辑更快地完成它。我主要是问这个问题以了解更多关于位移的信息,因为我怀疑任何答案都会加速程序真正显着。
答案 0 :(得分:3)
R,G和B并不等同于感知强度。总结一下比这更好的方法:
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
通过必要的位移和称重(假设为00RRGGBB):
sum+= ((pixel&0x00FF0000)>>16) * .30 / 255
+ ((pixel&0x0000FF00)>> 8) * .59 / 255
+ (pixel&0x000000FF) * .11 / 255;
您可能希望将/255
部分留在此处,并使用按比例放大的整数(例如30,59和11)替换浮点数,同时请记住您需要{{1 }} long
以防止溢出到合理的程度。