Search code examples
c#colorsrgbimagingchannel

How to calculate the average rgb color values of a bitmap


In my C# (3.5) application I need to get the average color values for the red, green and blue channels of a bitmap. Preferably without using an external library. Can this be done? If so, how? Thanks in advance.

Trying to make things a little more precise: Each pixel in the bitmap has a certain RGB color value. I'd like to get the average RGB values for all pixels in the image.


Solution

  • The fastest way is by using unsafe code:

    BitmapData srcData = bm.LockBits(
                new Rectangle(0, 0, bm.Width, bm.Height), 
                ImageLockMode.ReadOnly, 
                PixelFormat.Format32bppArgb);
    
    int stride = srcData.Stride;
    
    IntPtr Scan0 = srcData.Scan0;
    
    long[] totals = new long[] {0,0,0};
    
    int width = bm.Width;
    int height = bm.Height;
    
    unsafe
    {
      byte* p = (byte*) (void*) Scan0;
    
      for (int y = 0; y < height; y++)
      {
        for (int x = 0; x < width; x++)
        {
          for (int color = 0; color < 3; color++)
          {
            int idx = (y*stride) + x*4 + color;
    
            totals[color] += p[idx];
          }
        }
      }
    }
    
    int avgB = totals[0] / (width*height);
    int avgG = totals[1] / (width*height);
    int avgR = totals[2] / (width*height);
    

    Beware: I didn't test this code... (I may have cut some corners)

    This code also asssumes a 32 bit image. For 24-bit images. Change the x*4 to x*3