第9章 多媒體編程.ppt_第1頁(yè)
第9章 多媒體編程.ppt_第2頁(yè)
第9章 多媒體編程.ppt_第3頁(yè)
第9章 多媒體編程.ppt_第4頁(yè)
第9章 多媒體編程.ppt_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第9章多媒體編程,本章要點(diǎn): 什么是GDI+ GDI+的基本使用 用GDI+顯示文本和圖形 用GDI+操縱圖像,9.1接觸GDI+,GDI+是微軟公司為程序員提供的針對(duì)Windows平臺(tái)的新一代二維圖形系統(tǒng),利用它,程序員可以在窗體上繪制出各種各樣的圖形,或者顯示圖像。比起上一代的GDI,GDI+具有完全面向?qū)ο蟮奶卣?,它的?yōu)良設(shè)計(jì)在保證高效率的同時(shí),還提供了非常容易使用的接口,而且有很多新的功能是傳統(tǒng)GDI望塵莫及的。這些新功能包括: 對(duì)所有圖形基元的Alpha混合支持; 消除鋸齒; 漸變填充和紋理填充; 寬線; 基數(shù)樣條; 可縮放區(qū)域; 浮點(diǎn)坐標(biāo); 復(fù)合線; 嵌入鋼筆; 高質(zhì)量的篩選和縮放

2、; 大量的線型和筆尖選項(xiàng)。,9.1.1建立自定義控件 9.1.2測(cè)試自定義的控件 下面的任務(wù)是編寫(xiě)一個(gè)測(cè)試程序來(lái)查看效果。新建一個(gè)Windows窗體程序,起名為Case9_1。我們需要把剛剛生成的MyButton.dll的引用加入到現(xiàn)在的項(xiàng)目中,方法如下: 用鼠標(biāo)指向工具箱圖標(biāo),讓工具箱出現(xiàn),可以在任何一個(gè)選項(xiàng)卡上單擊鼠標(biāo)右鍵(但最好還是在“Windows窗體”上,因?yàn)橐砑拥目丶部梢运闶且粋€(gè)Windows窗體控件),在彈出菜單中選擇【自定義工具箱】。 在彈出的“自定義工具箱”對(duì)話框中,選擇【 .NET框架組件】頁(yè),然后單擊【瀏覽】按鈕找到MyButton.dll文件,選擇【打開(kāi)】,然后單擊

3、【確定】按鈕關(guān)閉對(duì)話框,這時(shí)在選項(xiàng)卡末尾發(fā)現(xiàn)新添加的GradientButton控件??梢韵袷褂闷胀丶粯影阉诺酱绑w上,這時(shí)窗體上就出現(xiàn)了帶有漸變色的按鈕GradientButton1。,由于在代碼中已編寫(xiě)了處理文字的部分,現(xiàn)在就可以改變控件的Text屬性了(譬如改為“你好”),還可以改變控件的Font屬性,你會(huì)發(fā)現(xiàn)這些都被正確地處理了,字的顏色是由ForeColor屬性控制的,這也工作得很好。 如果查看“屬性”窗體的“雜項(xiàng)”,會(huì)發(fā)現(xiàn)兩個(gè)在Button控件中不存在的屬性:StartColor和EndColor,這是我們自定義的,它可以很好地集成到IDE中。 改變這兩個(gè)屬性,也會(huì)改變按鈕的外

4、觀。雙擊控件,一樣會(huì)彈出代碼窗口,可以輸入下面的代碼: Static iCounter As Integer = 0 Static sText As String = GradientButton1.Text iCounter += 1 GradientButton1.Text = sText & iCounter 按F5鍵運(yùn)行程序,在窗體中單擊幾次控件,可以看到,雖然按鈕上的文字如我們所愿地發(fā)生著變化,但是按鈕的顏色卻在發(fā)生無(wú)法捉摸的改變,這是因?yàn)樵谠O(shè)計(jì)時(shí)設(shè)定了按鈕的顏色是隨機(jī)變化的。,9.1.3點(diǎn)評(píng):Graphics對(duì)象 這是一個(gè)比較復(fù)雜的案例,盡管它僅僅只是揭示了GDI+強(qiáng)大功能的冰山一

5、角。 對(duì)于繼承、自定義屬性這些內(nèi)容,在第3章中講過(guò),你應(yīng)該不會(huì)陌生,現(xiàn)在就把精力集中到使用GDI+的部分,也就是OnPaint事件處理程序上。 從OnPaint過(guò)程的PaintEvent參數(shù)中,可以得到幾個(gè)重要的對(duì)象,其中之一就是Graphics對(duì)象: Dim g As Graphics = pe.Graphics Graphics對(duì)象是GDI+的基礎(chǔ)對(duì)象,如果把GDI+理解成一套繪圖的工具,例如筆、刷子和顏料等,那么Graphics就是畫(huà)布,一切繪圖都是發(fā)生在Graphics對(duì)象之上的。 創(chuàng)建 Graphics 對(duì)象后,可以使用它繪制線、填充形狀和繪制文本等。與 Graphics 對(duì)象一起使

6、用的主要對(duì)象如表9.1所示。,接下來(lái)要取得需要畫(huà)的區(qū)域,這樣才會(huì)知道畫(huà)的范圍有多大,一般來(lái)說(shuō),這就是控件所占的屏幕矩形的大小。不僅如此,本例中還用Inflate語(yǔ)句把這個(gè)矩形縮小了一點(diǎn),這是因?yàn)槿绻?huà)的區(qū)域與Button大小一樣大,就看不出Button的凸起效果了,你可以試著把這一句去掉,看看會(huì)發(fā)生什么現(xiàn)象。 再接著構(gòu)造一個(gè)Brush對(duì)象,也就是畫(huà)刷: Dim bgBrush As Brush = New Drawing2D.LinearGradientBrush( _ New Point(clientRect.X, clientRect.Y), _ New Point(clientRect.

7、Width, clientRect.Height), _ StartColor, EndColor) 它很像真的畫(huà)刷,可以在畫(huà)布上畫(huà)出各種顏色,而且使用的這個(gè)LinearGradientBrush還可以刷出漸變色。,g.FillRectangle(bgBrush, clientRect) 它調(diào)用Graphics類的FillRectange方法,讓bgBrush對(duì)象在clientRect的矩形中畫(huà)上它想畫(huà)的東西,我們知道,它會(huì)畫(huà)出漸變色來(lái)。依此推廣,所有的GDI+繪圖幾乎都是這種格式,用Graphics類的某個(gè)方法(畫(huà)圓,畫(huà)方或者寫(xiě)幾個(gè)字)調(diào)用某個(gè)畫(huà)筆(畫(huà)刷、字體),畫(huà)在某個(gè)地方(可能還要加上格

8、式什么的)。比如下面的畫(huà)字符串語(yǔ)句: g.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), clientRectF, m_textFormat) 它調(diào)用對(duì)象本身的字體,寫(xiě)出對(duì)象本身的Text屬性字符串,這就是為什么在“屬性”窗體中改變這些屬性的時(shí)候,按鈕上的文字也會(huì)改變。,前面說(shuō)過(guò),一切繪圖都要發(fā)生在Graphics對(duì)象上,下面的這一句就是: 可是,在按下按鈕的時(shí)候,按鈕的顏色就會(huì)改變,這是怎么實(shí)現(xiàn)的呢?就在按鈕的OnClick事件中: Protected Overrides Sub OnClick(ByVal e As Ev

9、entArgs) MyBase.OnClick(e) Dim r As New Random() StartColor = Color.FromArgb(r.Next() EndColor = Color.FromArgb(r.Next() End Sub 把兩個(gè)隨機(jī)數(shù)分別賦給StartColor和EndColor,當(dāng)按下按鈕的時(shí)候,OnPaint事件也會(huì)被自動(dòng)觸發(fā),從而導(dǎo)致按鈕被重新繪制,呈現(xiàn)出新的顏色。,9.2 更多了解GDI+的文本功能,9.2.1簡(jiǎn)單的藝術(shù)字程序 1陰影效果 Dim textSize As SizeF Dim g As Graphics Dim shadowBrush

10、As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個(gè)新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Tex

11、t, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 畫(huà)出陰影 g.DrawString(txtSampleText.Text, textFont, shadowBrush, _ x + 10, y + 10) 畫(huà)出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),2浮雕效果 Dim textSize As SizeF Dim g As Grap

12、hics Dim backBrush As Brush = Brushes.Black Dim textBrush As Brush = Brushes.White Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個(gè)新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.tx

13、tSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 畫(huà)出浮雕背景 g.DrawString(txtSampleText.Text, textFont, backBrush, x + 1, y + 1) 畫(huà)出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),3倒影效果 Dim textSize As SizeF Di

14、m g As Graphics Dim backBrush As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single Dim textHeight As Single 在圖片框picCanvas上面建立一個(gè)新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到

15、示例文字的大小,textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 得到文字高度 textHeight = textFont.GetHeight(g) 將全局變換平移(x, y),也就是將坐標(biāo)原點(diǎn)移至(x, y), 使畫(huà)布上將要畫(huà)的所有內(nèi)容向右邊移動(dòng)x,向下移動(dòng)y g.TranslateTransform(x, y) g.Dr

16、awString(txtSampleText.Text, textFont, textBrush, 0, -textHeight) 將全局變量的y分量乘以-1,也就是使畫(huà)布上將要畫(huà)的所有內(nèi)容垂直翻轉(zhuǎn)180度 g.ScaleTransform(1, -1.0F) g.DrawString(txtSampleText.Text, textFont, backBrush, 0, -textHeight),4變形效果 在編寫(xiě)這段代碼之前,請(qǐng)?jiān)诖绑w類定義的頂端加入一個(gè)Imports語(yǔ)句: Imports System.Drawing.Drawing2D 因?yàn)樵诖a中會(huì)用到System.Drawing.D

17、rawing2D名稱空間中的Matrix類。 接下來(lái)還是雙擊btnTransform按鈕,在它的事件處理程序中寫(xiě)下代碼: Dim textSize As SizeF Dim g As Graphics Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個(gè)新的空白Graphics g = picCanvas.CreateGraphics() g.Clea

18、r(Color.White), 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 將全局變換平移(x, y),也就是將坐標(biāo)原點(diǎn)移至(x, y), 使畫(huà)布上將要畫(huà)的所有內(nèi)容向右邊移動(dòng)x,向下移動(dòng)y g.TranslateTransform(x, y) 做切變,將原始矩形的下邊緣水平移動(dòng)矩形高度的1.0倍 D

19、im textTransform As Matrix = g.Transform textTransform.Shear(1.0, 0) g.Transform = textTransform 畫(huà)出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, 0, 0),5三維效果 Dim textSize As SizeF Dim g As Graphics Dim backBrush As Brush = Brushes.Gray Dim textBrush As Brush = Brushes.Black Dim textFont As

20、 New Font(宋體, Me.nudFontSize.Value, FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個(gè)新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.

21、Height - textSize.Height) / 2 畫(huà)出背景的3D部分 Dim i As Integer For i = 10 To 0 Step -1 g.DrawString(txtSampleText.Text, textFont, backBrush, _ x - i, y + i) Next 畫(huà)出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),9.2.2程序點(diǎn)評(píng) 從本案例幾個(gè)文字效果的設(shè)計(jì)中可以看到,GDI+在很大程度上是把文字作為圖形來(lái)處理的,加上Brush、Font的有機(jī)配合,我們就擁有了豐富的

22、手段來(lái)制作各種各樣的文字效果。,9.3 動(dòng)畫(huà)效果飛行的球,9.3.1編寫(xiě)動(dòng)畫(huà) 新建一個(gè)Windows窗體應(yīng)用程序Case9_3,在窗體中放置一個(gè)定時(shí)器(Timer)控件,命名為tmrAnimation,將它的Enable屬性設(shè)置為T(mén)rue,Interval屬性設(shè)置為20,表示每20ms觸發(fā)一個(gè)定時(shí)器事件。 隨后,可以在代碼窗口中,找到窗體Form1的類定義,在 Public Class Form1 Inherits System.Windows.Forms.Form 和 End Class 之間,加入代碼: 用來(lái)“裝”球的位圖 Dim bitmap As bitmap,x, y記載位圖的位置,

23、r代表球的半徑 Dim x, y, r As Integer offsetX和offsetY分別表示球每次沿x軸和y軸移動(dòng)的距離 Dim offsetX, offsetY As Integer 位圖的寬和高 Dim bitmapWidth, bitmapHeight As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 初始化變量 r = 20 x = 1 y = 1 offsetX = 5 offsetY = 5 位圖必

24、須足夠大,不僅能容納球本身,還能遮住上一個(gè)循環(huán)中位圖留下的痕跡 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY,在位圖中間畫(huà)一個(gè)球 bitmap = New Bitmap(bitmapWidth, bitmapHeight) Dim g As Graphics g = Graphics.FromImage(bitmap) With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offsetX, offsetY, 2 * r, 2 *

25、 r) .Dispose() End With End Sub Private Sub tmrAnimation_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAnimation.Tick Dim g As Graphics = CreateGraphics() 在恰當(dāng)?shù)奈恢卯?huà)出位圖(球) g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight),g.Dispose() 如果球碰到了窗體的邊界,則令其反彈 If x + bitmapWid

26、th = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 改變球的位置,以產(chǎn)生運(yùn)動(dòng) x += offsetX y += offsetY End Sub,9.3.2幾個(gè)程序設(shè)計(jì)技巧 產(chǎn)生運(yùn)動(dòng)圖像本身并不難,事實(shí)上,讓球“動(dòng)起來(lái)”的代碼僅僅只有三句而已。首先是畫(huà)出球: g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight) 其次是改變球的坐標(biāo),在下一次畫(huà)出球的時(shí)候,球就“動(dòng)”了: x += offsetX y += offsetY

27、 然而,有許多細(xì)節(jié)需要考慮,這就是程序中其他代碼做的工作。主要需要處理的問(wèn)題有兩個(gè):,1邊界問(wèn)題 當(dāng)球到達(dá)窗體的邊界時(shí),應(yīng)該讓它反彈回來(lái)。為了達(dá)到這種效果,在畫(huà)出球之后,要檢測(cè)球是否到達(dá)了窗體的邊界: If x + bitmapWidth = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 如果x + bitmapWidth大于窗體的寬度,也就是說(shuō),位圖的右邊已經(jīng)到窗體的右邊界之外了?;蛘?,如果x小于等于0了,也就是說(shuō),位圖的左邊已經(jīng)到了窗體的左邊界之外了。這時(shí)就要讓球在水平方向

28、上回轉(zhuǎn),也就是改變offsetX的符號(hào)。這樣當(dāng)下一個(gè)x += offsetX執(zhí)行的時(shí)候,加變成了減,減變成了加,球也就乖乖地回頭了。 在垂直方向的情況也是一樣,當(dāng)位圖的下邊到達(dá)了窗體的下邊界之外,或者位圖的上邊到達(dá)了窗體的上邊界之外的時(shí)候,就需要改變offsetY的符號(hào),讓球在垂直方向上回頭。,2軌跡問(wèn)題 由于在程序中我們已經(jīng)解決了這個(gè)問(wèn)題,所以你可能不知道軌跡問(wèn)題會(huì)帶來(lái)什么樣的結(jié)果,那么請(qǐng)將Form1_Load過(guò)程中,在位圖對(duì)象中間畫(huà)圓的語(yǔ)句從原來(lái)的 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offset

29、X, offsetY, 2 * r, 2 * r) .Dispose() End With 改成: With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 然后再運(yùn)行程序,就會(huì)看到如圖9.12所示的畫(huà)面。,在球走過(guò)的地方,留下了軌跡,這是為什么呢?其實(shí),這是很自然的,因?yàn)楫?dāng)GDI+在窗體中畫(huà)了一個(gè)球以后,并沒(méi)有把這個(gè)球抹掉,而此后一次一次地畫(huà)球,圖像也都保留了下來(lái),于是就產(chǎn)生了我們看到的現(xiàn)象。 那么,為什么原來(lái)的程序中就沒(méi)有留下軌跡呢?那就要

30、看程序中初始化bitmapWidth 和bitmapHeight的代碼了: 位圖必須足夠大,不僅能容納球本身,還能遮住上一個(gè)循環(huán)中位圖留下的痕跡 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY bitmap是用來(lái)容納球的,應(yīng)該說(shuō),其寬度和高度只要有球的直徑那么大,也就是“2 * r”就夠了,為什么要加上一個(gè)“2 * offsetX”和“2 * offsetY”呢?請(qǐng)看原來(lái)程序中,把球畫(huà)在bitmap中的語(yǔ)句: With g .Clear(BackColor) .FillEllipse(Brushes.Re

31、d, New Rectangle(offsetX, offsetY, 2 * r, 2 * r) .Dispose() End With,其中FillEllipse語(yǔ)句把球畫(huà)在bitmap的中間,讓球離bitmap的左邊界有offsetX的距離,離bitmap的上邊界有offsetY的距離。由于bitmap的寬“2 * r + 2 * offsetX”,所以這時(shí)球離bitmap的右邊界的距離是offsetX,而又因?yàn)閎itmap的高是“2 * r + 2 * offsetY”,所以球離bitmap的下邊界的距離是offsetY。換句話說(shuō),在球的左右留出了寬度為offsetX的邊,在球的上下留出

32、了寬度為offsetY的邊,而這個(gè)邊的顏色與窗體顏色相同。 由于有這樣一道邊,當(dāng)GDI+把bitmap畫(huà)在窗體上的時(shí)候,就剛好可以遮蔽掉上一次留下的痕跡,于是,在球運(yùn)動(dòng)的過(guò)程中就沒(méi)有軌跡出現(xiàn)了。但是,當(dāng)把代碼改成 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 的時(shí)候,bitmap的效果如圖9.14所示。,9.4動(dòng)畫(huà)效果眨動(dòng)的眼睛,在上一節(jié)中,展示了如何通過(guò)連續(xù)地在不同的位置畫(huà)出同一個(gè)圖像來(lái)達(dá)到動(dòng)畫(huà)效果,這并不是達(dá)到動(dòng)畫(huà)唯一的途徑。通

33、過(guò)在同一個(gè)位置連續(xù)地畫(huà)不同的圖像,也可以產(chǎn)生動(dòng)畫(huà)效果,這就是本節(jié)所要采用的方法。,9.4.1準(zhǔn)備工作 9.4.2編寫(xiě)動(dòng)畫(huà),9.5 操縱圖像,GDI+不僅提供了繪圖的功能,而且也提供了很多圖像操縱功能,例如翻轉(zhuǎn)、縮放和剪切等,這些功能使用起來(lái)都很方便。而且Windows Forms把它們包裝在PictureBox控件中,讓我們使用起來(lái)更加方便了。 本節(jié)中將要展示如何利用PictureBox以及GDI+來(lái)實(shí)現(xiàn)圖像的翻轉(zhuǎn)、縮放和剪切。完成這一切所需要做的工作非常簡(jiǎn)單,這也顯示了GDI+強(qiáng)大的功能。,9.5.1簡(jiǎn)單的圖像處理窗體 新建一個(gè)Windows窗體應(yīng)用程序Case9_5,在窗體中放置4個(gè)按鈕控

34、件,屬性設(shè)置如表9.3所示。這4個(gè)按鈕將分別完成它們所標(biāo)示的功能。 接下來(lái)放入一個(gè)群組(GroupBox)控件,設(shè)置它的Text屬性為“剪切圖像”。在這個(gè)控件的區(qū)域內(nèi),放入4個(gè)文本框,屬性設(shè)置如表9.4所示。它們是給用戶來(lái)確定剪切區(qū)域的,也可以給它們加上標(biāo)簽?,F(xiàn)在在GroupBox中放入兩個(gè)按鈕,屬性設(shè)置如表9.5所示。,窗體布局,1向左旋轉(zhuǎn) 雙擊“向左旋轉(zhuǎn)”按鈕,在它的事件處理程序中寫(xiě)入以下代碼: picImage.Image.RotateFlip(RotateFlipType.Rotate270FlipNone) picImage.Refresh() 這一段代碼讓圖像向右旋轉(zhuǎn)270(也就相

35、當(dāng)于向左旋轉(zhuǎn)90),然后刷新圖片框,讓新的圖像顯示出來(lái)。在GDI+中提供的圖像旋轉(zhuǎn)一律都是向右旋轉(zhuǎn),所以要實(shí)現(xiàn)向左旋轉(zhuǎn)的功能,需要做這樣一個(gè)小小的替換。這時(shí)就可以使用“向左旋轉(zhuǎn)”功能了,按F5鍵運(yùn)行程序,然后在窗體上用鼠標(biāo)單擊【向左旋轉(zhuǎn)】按鈕,得到的效果如圖9.18所示。如果繼續(xù)單擊【向左旋轉(zhuǎn)】按鈕,圖像也會(huì)繼續(xù)旋轉(zhuǎn)。,2向右旋轉(zhuǎn) 與“向左旋轉(zhuǎn)”幾乎相同,只是代碼改成向右旋轉(zhuǎn)90: picImage.Image.RotateFlip(RotateFlipType.Rotate90FlipNone) picImage.Refresh() 按F5鍵運(yùn)行程序,然后在窗體上用鼠標(biāo)單擊【向右旋轉(zhuǎn)】按鈕。

36、,3放大 雙擊“放大”按鈕,在它的事件處理程序中寫(xiě)入以下代碼: picImage.SizeMode = PictureBoxSizeMode.StretchImage picImage.Width = CInt(picImage.Width * 1.25) picImage.Height = CInt(picImage.Height * 1.25) 首先把圖片框picImage的定位方式設(shè)置為StretchImage,也就是拉扯圖像,強(qiáng)迫圖像與圖片框一樣大。接下來(lái),把圖片框的寬度和高度都放大到原來(lái)的1.25倍,這樣圖像也會(huì)被拉扯到原來(lái)的1.25倍。按F5鍵運(yùn)行程序,用鼠標(biāo)單擊【放大】按鈕,效果

37、如圖9.20所示。,4縮小 與“放大”幾乎相同,只是將圖片框的寬度和高度都改成原來(lái)的0.8倍: picImage.SizeMode = PictureBoxSizeMode.StretchImage If picImage.Width 3 And picImage.Height 3 Then picImage.Width = CInt(picImage.Width * 0.8) picImage.Height = CInt(picImage.Height * 0.8) End If 按F5鍵運(yùn)行程序,然后在窗體上用鼠標(biāo)單擊【縮小】按鈕,效果如圖9.21所示。,5剪切預(yù)覽 剪切預(yù)覽功能可以在用戶

38、確定的剪切區(qū)域上顯示一個(gè)紅色方框,讓用戶可以看到剪切區(qū)域和剪切以后的效果。 雙擊“預(yù)覽”按鈕,在它的事件處理程序中寫(xiě)入以下代碼: 在剪切區(qū)域畫(huà)一個(gè)紅色的方框 Dim recCropBox As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) picImage.CreateGraphics.DrawRectangle(Pens.Red, recCropBox) 代碼首先取得用戶所選定的方框,用用戶輸入的4個(gè)參數(shù)來(lái)建立一個(gè)Rectangle(矩形)對(duì)象,然后在這個(gè)矩形框邊上畫(huà)上紅色

39、。,6剪切 剪切也就是把圖像的某一部分剪掉,只保留另外一部分。在這個(gè)程序中,用戶輸入的4個(gè)參數(shù)就是用來(lái)表示應(yīng)該保留哪一部分的。 雙擊“剪切”按鈕,在它的事件處理程序中寫(xiě)入以下代碼: 記錄剪切區(qū)域 Dim recCrop As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) 生成一個(gè)新的Bitmap,將把剪切后的圖像畫(huà)到這里 Dim bmpCropped As New Bitmap(CInt(txtW.Text), CInt(txtH.Text) 得到一個(gè)新的Graphics對(duì)象

40、 Dim grBitmap As Graphics = Graphics.FromImage(bmpCropped) 把原始圖像在recCrop中的部分畫(huà)到bmpCropped上 grBitmap.DrawImage(picImage.Image, 0, 0, recCrop, GraphicsUnit.Pixel) 把新的bitmap放到picImage中 picImage.Image = bmpCropped 這段代碼首先記錄下用戶選擇的方框,用用戶輸入的4個(gè)參數(shù)建立一個(gè)矩形對(duì)象。,然后建立一個(gè)新的Bitmap來(lái)放置剪切以后的圖像;接下來(lái)就把原始圖像應(yīng)該保留的部分畫(huà)到新的Bitmap中,最

41、后把新的Bitmap放回到圖片框中。換句話說(shuō),程序并沒(méi)有真的“剪”和“切”圖像,而只是新畫(huà)了一幅而已。 按F5鍵運(yùn)行程序,設(shè)置剪切參數(shù)為X = 0、Y= 0、寬度=100、高度=100,然后在窗體上用鼠標(biāo)單擊【剪切】按鈕,效果如圖9.23所示。,9.5.2程序點(diǎn)評(píng) 在本案例中,我們看到了使用PictureBox控件和GDI+可以輕松地完成許多圖像處理工作,盡管這些功能還不足以讓你自己編寫(xiě)出Photoshop來(lái),但是完成日常的許多圖像工作卻已經(jīng)足夠了。,9.6 制作一個(gè)屏幕保護(hù)程序,在這一節(jié)中,我們會(huì)用GDI+制作一個(gè)屏幕保護(hù)程序。 制作Windows下的屏幕保護(hù)程序聽(tīng)起來(lái)神秘,其實(shí)相當(dāng)簡(jiǎn)單,因

42、為Windows的屏幕保護(hù)程序?qū)嶋H上就是一個(gè)普通的應(yīng)用程序而已,只不過(guò)它的擴(kuò)展名不是.EXE而是.SCR。 Windows以命令行的方式調(diào)用這個(gè)程序,并且傳入一些參數(shù)。例如,“/c”參數(shù)表示要對(duì)此屏幕保護(hù)程序進(jìn)行設(shè)置;“/s”參數(shù)表示直接調(diào)用或預(yù)覽;而“/p”參數(shù)表示選中顯示器屬性對(duì)話框中屏幕保護(hù)程序標(biāo)簽時(shí),在對(duì)話框上的屏幕中顯示預(yù)覽效果等。,9.6.1目標(biāo) 本節(jié)介紹的屏幕保護(hù)程序會(huì)在屏幕上畫(huà)出一些很奇怪的圖形,這些圖形是由一條貝塞爾曲線和一條直線首尾相連組成的。在這個(gè)過(guò)程中你還會(huì)學(xué)到如何使用GDI+的一個(gè)很有力的工具GraphicsPath。,9.6.2窗體,9.6.3屏幕保護(hù)代碼 下面就可

43、以開(kāi)始編碼了,把以下列出的代碼寫(xiě)入類Form1的定義中,“Windows 窗體設(shè)計(jì)器生成的代碼”與“End Class”之間。 Dim m_Graphics As Graphics Dim m_ScreenWidth, m_ScreenHeight As Integer Dim randnum As New Random() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 取得窗體的Graphics對(duì)象,以供繪畫(huà)用 m_Graphics

44、= Me.CreateGraphics 取得窗體的寬度和高度,以便決定繪畫(huà)的位置 m_ScreenWidth = Me.Width m_ScreenHeight = Me.Height End Sub,Private Sub tmrDrawShape_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDrawShape.Tick 隨機(jī)顏色 Dim randColor As Color 隨機(jī)的GraphicsPath開(kāi)始點(diǎn)和結(jié)束點(diǎn) Dim randStartPoint, randEndPoint

45、 As Point 貝塞爾曲線的兩個(gè)隨機(jī)控制點(diǎn) Dim randCtrlPoint1, randCtrlPoint2 As Point 隨機(jī)的GraphicsPath Dim randGrphPath As New System.Drawing.Drawing2D.GraphicsPath() 生成隨機(jī)顏色 randColor = Color.FromArgb(randnum.Next(255), randnum.Next(255), _ randnum.Next(255), randnum.Next(255),生成4個(gè)隨機(jī)點(diǎn) randStartPoint = New Point(randNum.Next(m_ScreenWidth), _ randNum.Next(m_ScreenHeigh

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論