




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在Visual C#下實(shí)現(xiàn)圖像的透明處理 作者: 以前編程實(shí)現(xiàn)圖像的透明處理是比較困難的,代碼量多,工作又復(fù)雜。不過(guò),現(xiàn)在隨著微軟VS.Net開(kāi)發(fā)工具的逐漸普及,伴隨而來(lái)的新興開(kāi)發(fā)語(yǔ)言C#以及GDI+等新的編程機(jī)制正為廣大開(kāi)發(fā)人員所接受。本文就向大家介紹在Visual C#中,如何運(yùn)用GDI+中Alpha Blending技術(shù)實(shí)現(xiàn)圖像的透明處理。 在各類(lèi)有關(guān).Net的技術(shù)論壇上常有人問(wèn)如何實(shí)現(xiàn)透明的圖像或圖形效果,答案很簡(jiǎn)單,就是Alpha Blending技術(shù)。Alpha Blending技術(shù)是一個(gè)混合各種顏色值并產(chǎn)生透明效果的過(guò)程。具體的實(shí)現(xiàn)原理也很簡(jiǎn)單:在GDI+中,任何一種顏色由四種成
2、分組成Alpha,Red,Green和Blue。其中的Alpha成分則代表了一種顏色的透明程度,它的值在0到255之間變化。不言而喻,0代表完全透明而255則表示完全不透明。因此,你只要用透明效果創(chuàng)建一種顏色并用該顏色來(lái)畫(huà)圖像就可以完成圖像的透明處理了。 原理雖然比較簡(jiǎn)單,但是要初學(xué)者實(shí)際操作起來(lái)可能也并不是那么容易。所以下面我就向大家展示一個(gè)很好的實(shí)例。在該實(shí)例中,我先在窗體上畫(huà)了一些圖形,這些圖形包括直線(xiàn)、曲線(xiàn)、橢圓等,同時(shí)這些圖形有的是不透明的、有的是半透明的、有的是強(qiáng)透明的(注:其中的"強(qiáng)透明"意思為非常透明,幾乎為全透明,但是又隱約可見(jiàn))。如果你有GDI+編程的一
3、些基本知識(shí),完成這些應(yīng)該并不困難。然后,我在這些圖形上覆蓋了一幅圖像,在正常情況(也就是不透明的情況)下,窗體上的圖形為圖像所遮蓋,所以應(yīng)該是看不見(jiàn)的。接著,我通過(guò)一個(gè)按鈕的消息響應(yīng)函數(shù)使得圖像具有透明效果,這樣一來(lái)的話(huà),窗體上原來(lái)的那些圖形就會(huì)浮現(xiàn)出來(lái)。 實(shí)現(xiàn)方法首先,打開(kāi)VS.net,新建一個(gè)Visual C#的項(xiàng)目,選擇模板為"Windows應(yīng)用程序",同時(shí)不妨命名為"TransparentImage",圖示如下: 圖1接著,進(jìn)行窗體布局。往窗體上添加三個(gè)按鈕以完成用戶(hù)輸入控制。將窗體的Text屬性設(shè)置為"圖像的透明處理示例";
4、將三個(gè)按鈕的Text屬性分別設(shè)置為"半透明"、"強(qiáng)透明"、"不透明";同時(shí),為界面美觀起見(jiàn)將三個(gè)按鈕的FlatStyle屬性均設(shè)置為Flat。最終,窗體布局的圖示如下: 圖2完成了窗體布局,我們接著開(kāi)始編寫(xiě)代碼。首先,我們添加窗體的Paint消息響應(yīng)函數(shù)。讀者可以發(fā)現(xiàn),我們?cè)谶M(jìn)行窗體布局的時(shí)候并沒(méi)有在窗體上添加pictureBox控件,那么我們?cè)趺达@示圖像并畫(huà)出各種圖形呢?這就要用到窗體的Paint消息響應(yīng)函數(shù)了,函數(shù)實(shí)現(xiàn)如下: private void Form1_Paint(object sender, System.Window
5、s.Forms.PaintEventArgs e)Graphics g = this.CreateGraphics();g.Clear(this.BackColor);DrawPerson();/畫(huà)一幅圖像 Image curImage = Image.FromFile("e:photo.jpg");g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height);g.Dispose(); (注:其中的e:photo.jpg為筆者電腦上圖像文件的路徑,讀者可以將它改為自己電腦上圖像文件的路徑,下同。該文件可在源代碼文件
6、夾中找到。) 在上面的函數(shù)中,我們先建立了一個(gè)Graphics對(duì)象,該對(duì)象就是專(zhuān)門(mén)用來(lái)畫(huà)圖形和圖像的。我們還調(diào)用了本類(lèi)的一個(gè)私有成員函數(shù)DrawPerson(),該函數(shù)實(shí)現(xiàn)的功能就是在窗體上畫(huà)一些圖形,這些圖形包括了橢圓、曲線(xiàn)、三角形,而這些圖形合在一起恰好構(gòu)成了一個(gè)人的頭部輪廓,所以我姑且將該函數(shù)命名為了DrawPerson()。在調(diào)用完畢后,就在窗體上畫(huà)出一幅圖像(用一個(gè)圖像文件完成)。最后就是Graphics對(duì)象的Dispose工作。其中,DrawPerson()函數(shù)的具體實(shí)現(xiàn)如下: private void DrawPerson()Graphics g = this.CreateGra
7、phics();g.Clear(this.BackColor);/畫(huà)人頭輪廓Rectangle rect1 = new Rectangle(75, 0, 150, 200); g.FillEllipse(new SolidBrush(Color.FromArgb(225, 155, 150, 25), rect1);/定義三支畫(huà)筆,其中第一支為不透明,第二支為半透明,第三支為強(qiáng)透明Pen opqPen = new Pen(Color.FromArgb(155, 120, 205, 190), 15);Pen transPen = new Pen(Color.FromArgb(128, 25,
8、150, 25), 12);Pen totTransPen = new Pen(Color.FromArgb(140, 120, 18, 10), 10);/畫(huà)人頭的眼睛Rectangle rect2 = new Rectangle(70, 0, 160, 80);g.DrawArc( opqPen, rect2, 30, 40 );g.DrawArc( opqPen, rect2, 110, 40 );/畫(huà)人頭的鼻子Point threePoints=new Pointnew Point(140, 130), new Point(160, 130), new Point(150, 80);g
9、.DrawPolygon(transPen,threePoints);/畫(huà)人頭的嘴巴Rectangle rect3 = new Rectangle(110, 150, 80, 20);g.DrawEllipse(totTransPen,rect3);g.Dispose(); 請(qǐng)讀者注意,在上面的函數(shù)中,我們定義畫(huà)筆的時(shí)候定義了三支透明程度不同的畫(huà)筆:不透明、半透明、強(qiáng)透明,如此一來(lái)就可以完成圖形的透明效果。不過(guò),圖像的透明效果實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜,我將會(huì)在后面介紹。 這樣,我們就完成了窗體的初始化工作。在運(yùn)行程序后,窗體上就不是空白一片,而是有具體的圖像了。由于我們的圖像比較大,所以窗體上的圖形在
10、最初的時(shí)候是看不見(jiàn)的,只有當(dāng)圖像為透明時(shí),其中的人頭圖形才會(huì)顯現(xiàn),這就正好符合我們程序的初衷了。 接下來(lái),我們就著手實(shí)現(xiàn)圖像的透明效果。在實(shí)現(xiàn)圖像的透明效果過(guò)程中,我們需要用到了ColorMatrix和ImageAttributes等類(lèi),而這些類(lèi)包含在System.Drawing.Imaging名字空間中,所以我們?cè)谠创a文件的開(kāi)始處需添加:using System.Drawing.Imaging;來(lái)實(shí)現(xiàn)對(duì)這些類(lèi)的調(diào)用。還有,ImageAttributes類(lèi)是用來(lái)設(shè)置圖像的一系列屬性的,它被用作Graphics類(lèi)對(duì)象的DrawImage方法的一個(gè)參數(shù)。而ImageAttributes類(lèi)對(duì)象的方
11、法SetColorMatrix則調(diào)用ColorMatrix來(lái)設(shè)置圖像的顏色值。而圖像的透明效果正是又ColorMatrix中部分值所決定的。下面就是具體的實(shí)現(xiàn)方法了。 添加三個(gè)按鈕的消息響應(yīng)函數(shù)如下: "半透明"按鈕: private void button1_Click(object sender, System.EventArgs e)Graphics g = this.CreateGraphics();g.Clear(this.BackColor);DrawPerson();Bitmap bitmap = new Bitmap("e:photo.jpg&qu
12、ot;);float ptsArray = new float 1, 0, 0, 0, 0,new float 0, 1, 0, 0, 0,new float 0, 0, 1, 0, 0,new float 0, 0, 0, 0.5f, 0, /注意:此處為0.5f,圖像為半透明new float 0, 0, 0, 0, 1; ColorMatrix clrMatrix = new ColorMatrix(ptsArray);ImageAttributes imgAttributes = new ImageAttributes();/設(shè)置圖像的顏色屬性imgAttributes.SetColo
13、rMatrix(clrMatrix,ColorMatrixFlag.Default, ColorAdjustType.Bitmap);/畫(huà)圖像g.DrawImage(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height,GraphicsUnit.Pixel, imgAttributes);g.Dispose(); "強(qiáng)透明"按鈕: private void button2_Click(object sender, System.EventArgs
14、 e)Graphics g = this.CreateGraphics();g.Clear(this.BackColor);DrawPerson();Bitmap bitmap = new Bitmap("e:photo.jpg");float ptsArray = new float 1, 0, 0, 0, 0,new float 0, 1, 0, 0, 0,new float 0, 0, 1, 0, 0,new float 0, 0, 0, 0.1f, 0, /注意:此處為0.1f,圖像為強(qiáng)透明new float 0, 0, 0, 0, 1; ColorMatrix c
15、lrMatrix = new ColorMatrix(ptsArray);ImageAttributes imgAttributes = new ImageAttributes();/設(shè)置圖像的顏色屬性imgAttributes.SetColorMatrix(clrMatrix,ColorMatrixFlag.Default, ColorAdjustType.Bitmap);/畫(huà)圖像g.DrawImage(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height,Gra
16、phicsUnit.Pixel, imgAttributes);g.Dispose(); "不透明"按鈕: private void button3_Click(object sender, System.EventArgs e)Graphics g = this.CreateGraphics();g.Clear(this.BackColor);DrawPerson();/畫(huà)一幅圖像 Image curImage = Image.FromFile("e:photo.jpg");g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height);g.Dispose(); 這樣,我們就完成了三個(gè)按鈕的消息響應(yīng)函數(shù),整個(gè)程序也完畢了。按下Ctll+F5運(yùn)行程序,我們將得到如下所示的界面: 圖3上面的情況是最初始時(shí)的狀態(tài)。所以我們只可以看到一幅圖像卻看不到后面的圖形,為了驗(yàn)證后面的圖形是否存在,我們點(diǎn)擊"半透明"按鈕。這樣,上面的圖像就呈半透明狀態(tài),我們可以通過(guò)該圖像看到隱藏在圖像后面的圖形了,圖形就是上面所說(shuō)的人頭啊。效果圖示如下: 圖4不過(guò)這里的人頭圖形還不是那么明顯,不用著急,最后還有一個(gè)"強(qiáng)透明"效果還沒(méi)有試過(guò)呢,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 都勻三中小升初數(shù)學(xué)試卷
- 奉化今年高考數(shù)學(xué)試卷
- 2025年05月四川成都市青白江區(qū)婦幼保健院第二季面向社會(huì)招聘編外人員8人筆試歷年專(zhuān)業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025年云南迪慶州德欽縣人民醫(yī)院招聘編外影像技術(shù)專(zhuān)業(yè)人員(1人)筆試歷年專(zhuān)業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 防暑知識(shí)培訓(xùn)課件
- 2025至2030純凈水零售行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢(xún)研究報(bào)告
- 湖南興湘科技創(chuàng)新有限公司招聘筆試真題2024
- 2024年衡水深州市市直機(jī)關(guān)選調(diào)筆試真題
- 港北區(qū)分班考數(shù)學(xué)試卷
- 福州名校聯(lián)考數(shù)學(xué)試卷
- 2025年廣東省高考生物試題
- 垃圾爐渣廠管理制度
- 2025安全生產(chǎn)月一把手講安全公開(kāi)課主題宣講三十三(60P)
- 2025至2030中國(guó)二甲醚汽車(chē)行業(yè)市場(chǎng)分析及競(jìng)爭(zhēng)形勢(shì)與發(fā)展前景預(yù)測(cè)報(bào)告
- 統(tǒng)編版七年級(jí)歷史上冊(cè)期末復(fù)習(xí)課件
- 2025春季學(xué)期國(guó)開(kāi)電大本科《人文英語(yǔ)4》一平臺(tái)機(jī)考真題及答案(第五套)
- 2025至2030中國(guó)匹克球市場(chǎng)前景預(yù)判與未來(lái)發(fā)展形勢(shì)分析報(bào)告
- 2025三明市三元區(qū)輔警考試試卷真題
- 新生兒高膽紅素血癥護(hù)理措施
- 防護(hù)窗拆除合同范本
- 關(guān)于問(wèn)責(zé)的工作報(bào)告
評(píng)論
0/150
提交評(píng)論