求和颜色值时使用位运算求和数字的最快方法

Fastest way to sum digits using bit operations when summing color values

我对数字求和的特殊情况处理以整数表示的颜色。 Java 函数 BufferedImage.getRGB returns 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);

我想知道是否可以使用一些位移逻辑来更快地完成它。我问这个问题主要是为了了解更多关于位移位的知识,因为我怀疑任何答案都会真正 显着.

加速程序

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)替换浮点数,请记住您需要 long sum 合理防止溢出