CImg中文手冊3

現(xiàn)在開始一個基于CImg的程序的例子桥氏;演示了如何使用CImg來加載、創(chuàng)建圖像實例猛铅;以及如何顯示圖像和處理鼠標(biāo)事件字支;下面的程序?qū)崿F(xiàn)了如下功能:加載一張彩色圖像“l(fā)ena.jpg”,然后執(zhí)行平滑操作奸忽,并將它顯示在窗口上祥款,創(chuàng)建事件循環(huán)并在鼠標(biāo)點(diǎn)擊圖片的時候,在另一個窗口繪制圖片被點(diǎn)擊對應(yīng)的這一行像素點(diǎn)的R月杉、G、B像素值統(tǒng)計信息抠艾,so,let's go:

  #include "CImg.h"
  using namespace cimg_library;
  int main() {
    CImg<unsigned char> image("lena.jpg"), visu(500,400,1,3,0);
    const unsigned char red[3]={255,0,0}, green[3]={0,255,0}, blue[3]={0,0,255};
    image.blur(2.5);
    CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
    while (!main_disp.closed && !draw_disp.closed) {
      main_disp.wait();
      if (main_disp.button && main_disp.mouse_y>=0) {
        const int y = main_disp.mouse_y;
    visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.dimx()-1,y,0,0),red,0,256,0);
    visu.draw_graph(image.get_crop(0,y,0,1,image.dimx()-1,y,0,1),green,0,256,0);
    visu.draw_graph(image.get_crop(0,y,0,2,image.dimx()-1,y,0,2),blue,0,256,0).display(draw_disp);
    }
      }
    return 0;
  }

示例圖(略)
下面是對上述代碼的詳細(xì)解釋:

  • #include "CImg.h"
    包含CImg的唯一頭文件苛萎;
  • using namespace cimg_library;
    使用CImg的主命名空間
  • int main() {
    定義主函數(shù)
  • CImg<unsigned char> image("lena.jpg"), visu(500,400,1,3,0);
    創(chuàng)建兩個unsigned char類型的圖像對象;第一個圖像對象從磁盤上的lena.jpg文件讀取而來检号;此處lena.jpg和當(dāng)前可執(zhí)行文件放在同一個目錄腌歉;同時ImageMagick必須已經(jīng)安裝,用來讀取JPG格式的文件齐苛;
    第二個圖片對象visu初始化成一個5004001(2D圖像)的彩色圖像(有RGB三個通道)翘盖;最后一個參數(shù)表示圖像visu所有像素全部置為0;因此visu將被初始化為純黑色凹蜂;
  • const unsigned char red[3]={255,0,0}, green[3]={0,255,0}, blue[3]={0,0,255};
    此處以數(shù)組的方式定義了三種不同的unsigned char類型的顏色變量馍驯;這些顏色變量將被用于接下來的繪制;
  • image.blur(2.5);
    對圖像進(jìn)行平滑玛痊;使用方差為2.5的高斯平滑函數(shù)來平滑圖像汰瘫;注意,很多CImg的函數(shù)有兩個版本擂煞;不帶get_前綴的函數(shù)(例如blur)是直接處理傳入的圖像對象混弥;帶get_前綴的函數(shù)(例如get_blur)會將處理后的圖像對象返回(會花費(fèi)更長的時間,因為需要額外的像素值拷貝操作对省,通過image = image.get_blur(2.5);這樣的方式調(diào)用)蝗拿;
  • CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
    創(chuàng)建兩個顯示窗口晾捏,第一個用來顯示輸入圖像,第二個顯示visu對象哀托,顯示相對應(yīng)的信息惦辛;
    默認(rèn)情況下,CImg顯示對象將處理用戶鼠標(biāo)和鍵盤事件萤捆;同時在Windows上裙品,能夠創(chuàng)建全屏顯示窗口;
  • while (!main_disp.closed && !draw_disp.closed) {
    進(jìn)入事件循環(huán)俗或,當(dāng)顯示窗口關(guān)閉時市怎,將退出事件循環(huán);
  • main_disp.wait();
    在事件循環(huán)中等待接收main_disp的鼠標(biāo)和鍵盤事件辛慰;
  • if (main_disp.button && main_disp.mouse_y>=0) {
    檢測鼠標(biāo)是否點(diǎn)擊在圖像顯示區(qū)域区匠,鼠標(biāo)事件可以區(qū)分不同類型的鼠標(biāo)點(diǎn)擊事件,但是在此并不需要區(qū)分帅腌;
  • const int y = main_disp.mouse_y;
    獲取被點(diǎn)擊的圖像的y座標(biāo)驰弄;
  • visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.dimx()-1,y,0,0),red,0,256,0);
    該行演示了大部分CImg類函數(shù)都支持的鏈?zhǔn)秸{(diào)用處理;第一個函數(shù)fill(0)將圖像所有像素值設(shè)為0速客,然后將visu對象返回戚篙,從而可以進(jìn)行鏈?zhǔn)秸{(diào)用draw_graph()函數(shù);draw_graph()函數(shù)在圖像中繪制一個多邊形溺职;多邊形數(shù)據(jù)來自image.get_crop函數(shù)的返回值岔擂,此處get_crop返回image對象的R通道第y行的數(shù)據(jù)。注意:CImg<T>對于彩色圖像是4維數(shù)據(jù)浪耘;R乱灵,G,B通道的數(shù)據(jù)通過設(shè)置v=0,v=1,v=2獲取到七冲;
  • ** visu.draw_graph(image.get_crop(0,y,0,1,image.dimx()-1,y,0,1),green,0,256,0); **
    繪制鼠標(biāo)點(diǎn)擊行處原始圖像的G通道信息痛倚;
  • visu.draw_graph(image.get_crop(0,y,0,2,image.dimx()-1,y,0,2),blue,0,256,0).display(draw_disp);
    同上行,繪制鼠標(biāo)點(diǎn)擊行處原始圖像的B通道信息澜躺;
  • ...till the end
    后續(xù)代碼蝉稳,無需解釋。
    如上苗踪,使用CImg庫能夠?qū)懗鼍喼庇^的代碼颠区,同時寫出的代碼能夠正常運(yùn)行在Windows和Unix系統(tǒng)中;
    CImg庫提供了一系列的示例程序在源碼的examples目錄下通铲,展示了更多精簡的CImg庫方法使用示例毕莱;總能找到你需要示例;
    同時,CImg_test.cpp文件包含了很多簡短而又多樣化的關(guān)于CImg的使用示例朋截;在該文件中蛹稍,所有的CImg庫中的類都被使用到,并且這些代碼都非常易讀部服。建議從該文件開始學(xué)習(xí)如何使用CImg唆姐。

CImg圖形繪制函數(shù)

從CImg的HTML文檔里能找到詳細(xì)的圖形繪制函數(shù)列表和用法;使用前需要注意的幾點(diǎn):

  • 圖形繪制函數(shù)會直接繪制在傳入?yún)?shù)中廓八,并且會將傳入的圖像實例返回奉芦,從而實現(xiàn)圖形繪制函數(shù)的鏈?zhǔn)秸{(diào)用(后面有示例用法);繪制函數(shù)通過發(fā)生在2D圖像上剧蹂,但是也可以進(jìn)行3D圖像的繪制声功;
  • 繪制的時候通常需要一個顏色參數(shù),顏色參數(shù)必須以C數(shù)組的形式定義宠叼。

使用CImg訪問和操作圖像像素

CImg定義了一系列宏來簡化繁瑣的for循環(huán)嵌套逐點(diǎn)訪問和操作圖像像素數(shù)據(jù)先巴;使用CImg預(yù)定義的宏可以寫出簡潔的代碼實現(xiàn)逐點(diǎn)訪問和操作圖像像素數(shù)據(jù)的功能(副作用是如果你不懂這些宏,基本看不懂使用CImg寫出來代碼)冒冬;下面是這些宏的介紹伸蚯,主要分為四類:

  • 逐點(diǎn)訪問圖像像素
    cimg_map(img,ptr,T): 該宏定義了使用類型為T的指針ptr最末尾像素到最開始像素依次訪問img的像素數(shù)據(jù),ptr指針每次指向圖像像素數(shù)據(jù)简烤;注意:
    • img必須是非空的cimg_library::CImg類實例變量剂邮,像素數(shù)據(jù)類型必須為T
    • ptr為T*類型的指針横侦;
      該宏不經(jīng)常使用抗斤,需要用到該宏的地方一般都可以用CImg的類函數(shù)實現(xiàn),例如:
  CImg<float> img(320,200);
  cimg_map(img,ptr,float) { *ptr=0; }      // Equivalent to 'img.fill(0);'

cimg_mapoff(img,off): 該宏通過off訪問像素數(shù)據(jù)丈咐,從圖像起始到圖像末尾;注意: off是內(nèi)部循環(huán)變量龙宏;訪問圖像第一個像素位置時off=0棵逊,訪問到圖像最后一個像素位置時,off=img.size()-1银酗。示例:

  CImg<float> img(320,200);
  cimg_mapoff(img,off) { img[off]=0; }  // Equivalent to 'img.fill(0);'

Github上CImg項目中已有詳細(xì)的中文入門PDF文檔辆影,所以后續(xù)不再翻譯入門文檔。CImg.h最新版本有5萬8千行代碼黍特,有時間對CImg的具體函數(shù)進(jìn)行介紹蛙讥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灭衷,隨后出現(xiàn)的幾起案子次慢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迫像,死亡現(xiàn)場離奇詭異劈愚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闻妓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門菌羽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人由缆,你說我怎么就攤上這事注祖。” “怎么了均唉?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵是晨,是天一觀的道長。 經(jīng)常有香客問我浸卦,道長署鸡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任限嫌,我火速辦了婚禮靴庆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怒医。我一直安慰自己炉抒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布稚叹。 她就那樣靜靜地躺著焰薄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扒袖。 梳的紋絲不亂的頭發(fā)上塞茅,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音季率,去河邊找鬼野瘦。 笑死,一個胖子當(dāng)著我的面吹牛飒泻,可吹牛的內(nèi)容都是我干的鞭光。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼泞遗,長吁一口氣:“原來是場噩夢啊……” “哼惰许!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起史辙,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤汹买,失蹤者是張志新(化名)和其女友劉穎佩伤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦睹,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畦戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了结序。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片障斋。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徐鹤,靈堂內(nèi)的尸體忽然破棺而出垃环,到底是詐尸還是另有隱情,我是刑警寧澤返敬,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布遂庄,位于F島的核電站,受9級特大地震影響劲赠,放射性物質(zhì)發(fā)生泄漏涛目。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一凛澎、第九天 我趴在偏房一處隱蔽的房頂上張望霹肝。 院中可真熱鬧,春花似錦塑煎、人聲如沸沫换。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯赏。三九已至,卻和暖如春冷尉,著一層夾襖步出監(jiān)牢的瞬間漱挎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工雀哨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留识樱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓震束,卻偏偏與公主長得像,于是被迫代替她去往敵國和親当犯。 傳聞我的和親對象是個殘疾皇子垢村,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容