EGE基礎 光柵操作篇

2021-10-02 21:21:39 字數 4751 閱讀 2678

ege專欄:ege專欄

光柵圖也叫做位圖、位圖、畫素圖。影象其實由乙個個畫素點組成,每個畫素點都有自己的顏色。顯示屏就是由乙個個的小點組成,當這些點都很小,而且都很緊密地排在一起時。我們就看到一幅連續的影象。但靠近看時,還是能看到一一的小點。

輸出時,是讀取視訊記憶體中的每乙個點的顏色資料,然後根據顏色輸出顯示屏上。

點的顏色是用無符號整型表示的,繪圖時就是在改變這些顏色資料。既然是改變顏色資料,那就有原有資料和新資料,所以改變就有很多種操作方式,一般是位操作。可以是直接賦值,也可以是保留原有資料,或者兩個數值位與,位或,取反等。

二元光柵操作碼就是用來控制改變畫素時的位操作方式的。每個二元光柵操作碼對應一種位操作方式。

設定位操作方式的函式為setwritemode, 函式宣告:

void

setwritemode

(int mode, pimage pimg =

null

);

其中的mode就是二元光柵操作碼, pimg是要設定的影象,為null時就是指的是視窗,當在pimg的影象上繪圖時,就是根據二元光柵碼表示的位操作模式來改變顏色。

ege支援全部的16種操作碼, 羅列如下

r2_black			繪製出的畫素顏色 = 黑色

r2_copypen 繪製出的畫素顏色 = 當前顏色(預設)

r2_masknotpen 繪製出的畫素顏色 = 原有顏色 and

(not 當前顏色)

r2_maskpen 繪製出的畫素顏色 = 原有顏色 and 當前顏色

r2_maskpennot 繪製出的畫素顏色 =

(not 原有顏色) and 當前顏色

r2_mergenotpen 繪製出的畫素顏色 = 原有顏色 or

(not 當前顏色)

r2_mergepen 繪製出的畫素顏色 = 原有顏色 or 當前顏色

r2_mergepennot 繪製出的畫素顏色 =

(not 原有顏色) or 當前顏色

r2_nop 繪製出的畫素顏色 = 原有顏色

r2_not 繪製出的畫素顏色 = not 原有顏色

r2_notcopypen 繪製出的畫素顏色 = not 當前顏色

r2_notmaskpen 繪製出的畫素顏色 =

not(原有顏色 and 當前顏色)

r2_notmergepen 繪製出的畫素顏色 =

not(原有顏色 or 當前顏色)

r2_notxorpen 繪製出的畫素顏色 =

not(原有顏色 xor 當前顏色)

r2_white 繪製出的畫素顏色 = 白色

r2_xorpen 繪製出的畫素顏色 = 原有顏色 xor 當前顏色

所以二元操作碼中的二元指的就是影象原來的顏色當前顏色

"當前顏色"是指通過setcolor() 或 setfillcolor()設定的用於當前繪製或填充的顏色。當我們在上面繪製時,就根據這兩個顏色和位操作模式計算得出最終的顏色。 後面還有個三元光柵操作碼,是用於影象處理的。

下面做個二元光柵操作碼的示例:

#

include

intmain()

可以看到修改位操作模式, r2_mergepen, 代表做位或操作,就得到了乙個不同的顏色。

三元光柵操作碼,是設定兩個影象繪圖時對畫素的一種位操作方式。兩個影象影象對應點上的兩個畫素顏色加上當前填充顏色一共三個,所以是三元。

三元光柵操作碼其實是在繪製影象時設定的,來看看putimage() 的宣告:

void egeapi putimage

(int dstx,

int dsty,

const pimage psrcimg, dword dwrop = srccopy)

;

putimage(0

,0, pimg,

0x00220326

);

如果在右邊找到名字,可以直接使用名字,但這個沒有。

三元光柵操作符的例子,摳圖:

;//顏色都是純白

//先把原圖複製到臨時影象上

putimage

(temp,0,

0, pimg)

;//做與操作

putimage

(temp,0,

0, mask, srcand)

;這樣我們就把中間的保留了,外面都變成了純黑。因為純黑就是0x000000, 所以接下來做或操作時,就相當於沒有。

這樣就成功了,別忘了,影象不用後要記得使用delimage()

delimage

(temp)

;delimage

(mask)

;delimage

(pimg)

;

**如下:

因為不知怎麼回事,我測試的縮放putimage(),三元操作碼失效,所以這個函式沒寫成縮放型

#

include

void

cutoutimage

(pimage dest,

int x,

int y,

int w,

int h, pimage src, pimage mask)

;//使用之前編寫的從檔案縮放載入影象函式

intgetimage_zoom

(pimage& pdstimg, lpcstr pimgfile,

int zoomwidth,

int zoomheight)

;int

main()

//原圖src, 和掩膜mask大小要一樣, x, y, w, h, 為在deset上繪製的區域

//因為不知怎麼回事,我測試的縮放putimage(),三元操作碼失效,所以這個函式沒寫成縮放型

void

cutoutimage

(pimage dest,

int x,

int y, pimage src, pimage mask)

ege專欄:ege專欄

EGE基礎 時間函式篇

ege專欄 ege專欄 delay time delay ms time delay fps fps delay jfps fps for is run delay fps 60 void api sleep long dwmilliseconds double fclock 通過不斷地獲取當前時間...

EGE基礎 視口篇

ege專欄 ege專欄 視口即可視的區域,通過改變視口,可以控制繪畫的區域,並且設定臨時的座標系。新的座標係以視口的左上角為新原點,並且超出視口的部分會被裁剪,外面的繪製不出來。視口一開始和視窗一樣大。所以繪製在視窗上的都能顯示出來,超出視窗區域會被裁剪。設定視口區域會改變座標系,視口區域需要在視窗...

django的orm操作篇(基礎篇)

獲取個數 models.tb1.objects.filter name seven count 大於,小於 models.tb1.objects.filter id gt 1 獲取id大於1的值 models.tb1.objects.filter id gte 1 獲取id大於等於1的值 model...