在对颜色值求和时使用位操作对数字求和的最快方法

时间:2015-01-31 15:37:05

标签: java bit-manipulation

我总结数字的特殊情况涉及表示为整数的颜色。 Java函数BufferedImage.getRGB0x00RRGGBB格式返回图像。我正在制作一个功能,为您提供图像上的灰度(颜色无关)颜色总和。目前,我的操作看起来很幼稚:

   //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);

我想知道我是否可以通过一些位移逻辑更快地完成它。我主要是问这个问题以了解更多关于位移的信息,因为我怀疑任何答案都会加速程序真正显着

1 个答案:

答案 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以防止溢出到合理的程度。