由
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畫了一大...