昨天在給豆瓣電台加皮膚功能的時候考慮的,需要遍歷圖像的每個像素,然後算出均值。如果圖片比較暗,那麼文字就變成白色的,如果圖片比較亮,文字就變成黑色的。直接在C#用計算這樣的計算是需要付出一定性能代價的(相比非托管代碼),而且圖片越大,性能損耗就越嚴重。所以考慮把這部分代碼寫到unsafe語句中,讓它在內存裡直接計算。具體代碼如下:
System.Drawing.Bitmap image = new System.Drawing.Bitmap(
Properties.Settings.Default.BackgroundPicture);
System.Drawing.Imaging.BitmapData data = image.LockBits(
new System.Drawing.Rectangle(0, 0, image.Width, image.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
unsafe{ long r = 0;
long g = 0;
long b = 0;
long pixelCount = data.Height * data.Width;
byte* ptr = (byte*)(data.Scan0);
for (int i = 0; i < data.Height; i++)
{ for (int j = 0; j < data.Width; j++)
{ r += *ptr;
g += *(ptr + 1);
b += *(ptr + 2);
ptr += 3;
} ptr += data.Stride - data.Width * 3;
}
double totalRGB = (r / pixelCount + g / pixelCount + b / pixelCount) / 3;
if(totalRGB > 127)
{
this.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0));
}
else
{
this.Foreground = new SolidColorBrush(Color.FromRgb(255, 255, 255));
}
}
還有一點需要注意的是如果在代碼裡使用了unsafe語句,必須在編譯的時候加上/unsafe參數,可以在Visual Studio【項目屬性】的【編譯選項】裡找到這個開關。