One approach is to get the 'centre of mass' (pseudocode):

float xaccum = 0, yaccum = 0; float divisor = 0; for(x = 0 to width-1) for(y = 0 to height-1) { float thisweight = pixels[x,y].A / 255f xaccum += x * thisweight; yaccum += y * thisweight; divisor += thisweight; } } PointF centre = [xaccum / divisor, yaccum / divisor];

(Yes, that can easily be optimised, particularly the divisor, but this forumlation is clear about the 'weighted average' nature of the calculation.)

This requires reading over the whole pixel array so it will be slow (even using LockBits and scanning the array instead of using GetPixel). I can't currently think of a way that doesn't involve that, though.

It weights by the transparency, if you want all non-transparent pixels (even with an alpha of 1 part in 255) to count as full weight set thisweight to 1 or 0.