C# 映像編程 (1) 準備工作; 你好,空姐; 為空白姐照片添加特效

來源:互聯網
上載者:User
文章目錄
  • (1) 準備實驗環境
  • (2) 第一個指令碼:你好,空姐
  • (3)像素操作示範——為照片增加夜光特效
  • (4)小插曲

很久之前,就想寫一系列C#映像編程的文章,但始終沒有下筆,其主要原因有二:(1)我的C#影像處理庫 Geb.Image 庫在大幅度變動中;(2)沒有找到一個很好的示範工具。現在,對於第一個問題,Geb.Image庫的基本結構已經確定了;對於第二個問題,選擇了LinqPad作為C#映像編程和示範工具,輕巧簡便。就從現在開始吧。

(1) 準備實驗環境

假設您熟悉C#編程,且電腦中有 32 位的.Net 4.0 環境。在此基礎上,我們開始搭建C# 映像編程的實驗環境。

第一步:下載安裝 LinqPad。

LinqPad 是一款小巧易用的C#程式碼片段編譯工具,有免費版與收費版,收費版比免費版多了自動完成功能。如果不需要自動完成功能,用免費版即可。

第二步:下載Geb.Image類庫

Geb.Image 是我的C#影像處理基本庫,地址:https://github.com/xiaotie/GebImage

其目錄結構如。這裡,我們只使用其中的dll目錄和scripts目錄。顧名思義,dll 就是一些基本的 dll,scripts 就是本系列文章所寫的 C# 指令碼。

第三步:設定 LinqPad

開啟 LinqPad ,按 【F4】快速鍵,進入 Query Properties 設定介面,在“Additional References”選項卡中,將dll目錄中的dll加入進去。

然後,在“Additional Namespace Imports”裡加入Geb.Image,Geb.Utils和Geb.Utils.WinForm 三個命名空間,點擊“Set as Default for new queries” 儲存:

這樣,我們就添加了必要的 dll 引用,添加了常用的命名空間。

接著,點擊LinqPad左下側的“Set Folder ... ”連結,將 scripts 目錄設定為工作目錄:

工作目錄中顯示的每一個檔案便是一個C#指令檔。雙擊可負載檔案。

(2) 第一個指令碼:你好,空姐

在工作目錄中,雙擊“1-1-顯示圖片”,可看到:

該指令碼的作用是載入顯示映像。在運行之前,需要將 baseDir 目錄更改為 scripts/img 目錄的實際路徑。點擊綠色三角形按鈕,一副熟悉的面孔出現了:

(3)像素操作示範——為照片增加夜光特效

下面,我們以空姐的照片為測試照片,來實現夜光特效演算法:

夜光特效實現起來非常簡單:將映像中的每個像素的Red值修改為當前值的1/2即可。程式檔案為scripts\001\1-2-夜光特效.linq,這裡通過四種方法來實現這一功能,來示範像素操作:

String baseDir = "E:\\MyWorkspace\\DotNetWorkspace\\01_Public_Geb.Image\\scripts\\img\\";unsafe void Main(){ImageRgb24 img = new ImageRgb24(baseDir + "cjk.jpg");img.ShowDialog("img");// 將映像看作連續的記憶體,通過位移量來訪問ImageRgb24 img2 = img.Clone();for(int i = 0; i < img2.Length; i++){Rgb24 p= img2[i];p.Red = (Byte)(p.Red/2);img2[i] = p;}img2.ShowDialog("img2");// 將映像看作一個二維“表格”,通過行和列座標來訪問ImageRgb24 img3 = img.Clone();for(int row = 0; row < img3.Height; row++){for(int col = 0; col < img3.Width; col ++){Rgb24 p= img3[row,col];p.Red = (Byte)(p.Red/2);img3[row,col] = p;}}img3.ShowDialog("img3");// 直接通過指標訪問ImageRgb24 img4 = img.Clone();{Rgb24* p = img4.Start;Rgb24* pEnd = p + img4.Length;while(p != pEnd){p->Red = (Byte)(p->Red/2);p++;}}img4.ShowDialog("img4");// 通過lambda運算式訪問ImageRgb24 img5 = img.Clone();img5.ForEach((Rgb24* p)=>{p->Red = (Byte)(p->Red/2);});img5.ShowDialog("img5");// Dispose 可以釋放映像所佔非管理記憶體。如果不Dispose,當GC銷毀對象時,也會釋放非管理記憶體。// img.Dispose();// img2.Dispose();// img3.Dispose();// img4.Dispose();// img5.Dispose();}

是不是很簡單呢?下面是娛樂時間。

(4)小插曲

為什麼用空姐作為示範圖片呢?讓我們從刀妹說起吧。

在《英雄聯盟》遊戲中有個外號“刀鋒意志”的英雄——艾瑞莉婭,俗稱刀妹。刀妹是一個暴力妹紙——“那把劍狂亂飛舞,彷彿蘸血為畫”。

由於過於暴力,刀妹屢次被削弱,有說被連續削弱12次,有說22次。以至於“某某太強了我們來削弱一下刀妹吧!”成了網路流行語了:蓋倫太強了,我們來削弱一下刀妹吧;卡牌太強了,我們來削弱一下刀妹吧;今天天氣不錯 我們來削弱一下刀妹吧 。。。

在影像處理界,也有一個無所不在的妹紙,Lena:

Lena 是 1972年的一期花花公子封面女郎,自從1973年,某同學將這張照片用在論文中後,這張圖片成了最常用的測試圖片了,幾乎在每本影像處理書中都可以看到她。

在地球上各個角落裡,這樣的聲音此起彼伏,曆經四十年而不衰:

程式寫完了,我們用Lena來測試下吧;

演算法最佳化了,我們用Lena來測試下吧;

……

在東方,空姐比Lena更具有親和力,俺就不以Lena為測試圖片了,代之以空姐。

程式寫完了,我們用空姐來測試下吧;

演算法最佳化了,我們用空姐來測試下吧;

……

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.