C#反色處理及其效率問題分析
本文實例分析了C#反色處理及其效率問題。分享給大家供大家參考。具體分析如下:
網(wǎng)上很多這方面的資料,??吹降陌姹救缦旅妫?br />
public Bitmap RePic(Bitmap thispic, int width, int height) { Bitmap bm = new Bitmap(width, height);//初始化一個記錄后的圖片的對象 int x, y, resultR, resultG, resultB; Color pixel; for (x = 0; x < width; x++) { for (y = 0; y < height; y++) { pixel = thispic.GetPixel(x, y); //獲取當(dāng)前坐標(biāo)的像素值 resultR = 255 - pixel.R; //反紅 resultG = 255 - pixel.G; //反綠 resultB = 255 - pixel.B; //反藍(lán) bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB)); //繪圖 } } return bm; //返回經(jīng)過處理后的圖片 }
上述代碼執(zhí)行沒有問題,但效率存在很大一個問題,執(zhí)行起來很慢,測試了一下1920 x 1080分辨率,執(zhí)行時間8秒左右;2560 x 1920分辨率,執(zhí)行時間達(dá)到了15秒左右,當(dāng)然小圖片處理起來要快一些,當(dāng)然也與CPU配置有關(guān)。
后來又嘗試了另外一種方法,利用System.Drawing.Imaging 中的BitmapData 和LockBits方法,其中用到了指針,代碼如下:
public Bitmap reversePic(Bitmap thispic) { Bitmap src = new Bitmap(Image.FromHbitmap(thispic.GetHbitmap())); // 加載圖像 BitmapData srcdat = src.LockBits(new Rectangle(Point.Empty, src.Size), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // 鎖定位圖 unsafe // 不安全代碼 { byte* pix = (byte*)srcdat.Scan0; // 像素首地址 for (int i = 0; i < srcdat.Stride * srcdat.Height; i++) pix[i] = (byte)(255 - pix[i]); } src.UnlockBits(srcdat); // 解鎖 return src; }
經(jīng)測試效率明顯提高了許多,2560 x 1920分辨率,執(zhí)行時間不到1秒,看來用指針操作果然效率會很高,但C#中對指針的操作視為不安全的,使用unsafe關(guān)鍵字后,編譯出錯,得將編譯器選項設(shè)置為允許對使用 unsafe 關(guān)鍵字的代碼進(jìn)行編譯。方法如下:
在 Visual Studio 開發(fā)環(huán)境中設(shè)置此編譯器選項
1. 打開項目的 “屬性”頁。
2. 單擊 “生成”屬性頁。
3. 選中 “允許不安全代碼”復(fù)選框。
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
c# 調(diào)用Surfer軟件,添加引用的具體操作方法
本篇文章主要是對c#中調(diào)用Surfer軟件,添加引用的具體操作方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C#使用foreach循環(huán)遍歷數(shù)組完整實例
這篇文章主要介紹了C#使用foreach循環(huán)遍歷數(shù)組,結(jié)合完整實例形式較為詳細(xì)的分析了C#遍歷數(shù)組的相關(guān)技巧,需要的朋友可以參考下2016-06-06VS2010寫的程序在自己電腦可以運(yùn)行、其他電腦上不能運(yùn)行的解決方案
自己用Visual Studio 2010 旗艦版寫了一個軟件,在自己電腦上運(yùn)行完全沒有問題,但是拷貝到其他人電腦上之后不管雙擊還是以管理身份運(yùn)行,均沒有反應(yīng),進(jìn)程管理器中相關(guān)進(jìn)程也只是一閃而過2013-04-04C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析
這篇文章主要介紹了C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析,包括websocket sharp組件的概念及使用方法,需要的朋友可以參考下2017-04-04