由GdkPixmap得到透明的GdkPixbuf

2021-04-07 01:04:10 字數 2671 閱讀 3701

gdkpixmap

得到透明的

gdkpixbuf

gdkpixmap

是gdkdrawable

的子類。

gdkdrawable

和win32

下的dc(devicecontext)

有點類似,你可以在上面畫直線、畫圓或者在上面貼。

dc有很多不同的子類,最常見的有記憶體

dc,印表機

dc,螢幕

dc。同樣,

gdkdrawable

也有很多子類,非要和

win32

對應起來的話,

gdkpixmap

的地位和記憶體

dc差不多。

gdkpixbuf

的功能近似於位圖

(bitmap)

,但一般僅限於在記憶體使用中,沒有定義特定的儲存格式。可以把任意格式的檔案加裁到乙個

gdkpixbuf中;

可以把gdkpixbuf

貼到gdkdrawable

任意子類的物件上

; 也可以把

gdkdrawable

任意子類的物件轉換成

gdkpixbuf

物件,然後把

gdkpixbuf

物件存為指定格式的檔案。

gtk+

提供了幾個函式在這兩者之間轉換:

gdk_draw_pixbuf

把gdkpixbuf

物件貼到

gdkdrawable

物件上。

gdk_pixbuf_get_from_drawable

從gdkdrawable

物件中得到

gdkpixbuf

物件。

gdkpixbuf

是gdkdrawable

的子類,這兩個函式自然也適用於

gdkpixmap。

最近遇到乙個問題,儘管我指明要透明的

gdkpixbuf

,通過gdk_pixbuf_get_from_drawable

得到的gdkpixbuf

仍然是不透明的。

gdkpixbuf

有乙個has_alpha

屬性,它是控制

gdkpixbuf

透明與否的第一關。只能在建立時設定它(

gdk_pixbuf_new

),對於已經存在的

gdkpixbuf

物件,不能再修改它的

has_alpha

屬性。

對於透明的

gdkpixbuf

,每個畫素在記憶體中佔四個位元組,也即

r(紅)、

g(綠)、

b(藍)三基色各佔乙個位元組,

alpha

佔乙個位元組。利用

alpha

的值可以實現(半

)透明效果,

alpha

的值為0

則完全透明,

alpha

的值為255

則完全不透明,中間的值為半透明。

我發現通過

gdk_pixbuf_get_from_drawable

得到的gdkpixbuf

是完全不透明的,從記憶體中的值可以看到每個畫素的

alpha

值都為255

,而且沒有任何引數可以控制

gdk_pixbuf_get_from_drawable

處理透明問題的行為。 把

gtk+

提供的相關函式翻了個遍,也沒有找到把

gdkpixbuf

轉換為透明效果

gdkpixbuf

的函式,最後只好自己寫了乙個,它的缺點是只能指定一種透明色,所有為這種透明色的

pixel

都是作透明處理。不過,這對正常應用沒有什麼影響。

void

gdk_pixbuf_transparent

(gdkpixbuf *

pixbuf

, guint32

pixel

)

p

+= 4;

}

break

;

default

:

break

;

}

pixels

+= pixbuf

->rowstride;

}

return

;

}

使用方法:

把黑色設定為透明色:

gdk_pixbuf_transparent(

pixbuf, 0x00000000);

把白色設定為透明色:

gdk_pixbuf_transparent(

pixbuf, 0xffffff00);

把紅色設定為透明色:

gdk_pixbuf_transparent(

pixbuf, 0xff000000);

把綠色設定為透明色:

gdk_pixbuf_transparent(

pixbuf, 0x00ff0000);

把藍色設定為透明色:

gdk_pixbuf_transparent(

pixbuf, 0x0000ff00);

由專案死鎖得到的教訓

該專案有乙個 pm,但他的主要任務,似乎只是負責與客戶交流。硬體部乙個主管負責硬體部分,我負責軟體部分。軟體部分的任務又分散在三個小組裡,乙個 os bios 組,負責 os和驅動部分。乙個 gui平台組,負責 gui的視窗管理系統和基本控制項。還有我所負責的 ap組,主要負責應用程式的開發。這個專...

檢查給定排列可否由棧得到

設計乙個演算法,檢查給定排列可否由棧得到。在回答yes時,演算法應同時輸出相應的操作序列。在你的演算法中,除了read print push和pop,你可以利用is empty s 測試棧s是否為空 棧 stack 是先進先出 fifo fisrt in first out 型的資料結構,具有這樣的...

由設計PCB得到的人生感悟

1 畫pcb的時候要經常比對著原理圖,好比做事的時候經常想著自己的目標和計畫,而一旦發現原先的設計不合適的時候就要及時改正。原理圖是需要在畫pcb的過程中不斷調整的,但是調整之後的原理圖還是要能夠實現設計的功能。生活的道路上計畫很多時候也是要不斷調整的,但是不能忘了自己的人生追求!2 pcb畫了一大...