程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 在C#用使用unsafe加快處理圖像速度

在C#用使用unsafe加快處理圖像速度

編輯:C#入門知識

昨天在給豆瓣電台加皮膚功能的時候考慮的,需要遍歷圖像的每個像素,然後算出均值。如果圖片比較暗,那麼文字就變成白色的,如果圖片比較亮,文字就變成黑色的。直接在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【項目屬性】的【編譯選項】裡找到這個開關。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved