Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Multimedia

k23:k23.3:k23.3.5:k23.3.5.4:start

23.3.5.4 Bild-Lupe

Das Projekt Bild-Lupe entstand aus dem adaptierten Quelltext von Fabien Bodard für sein Beispiel-Projekt MapView, den Sie im Zusammenhang mit der Komponente gb.map im → Kapitel 24.8.0 'Komponente Map' nachlesen können. Der Quelltext für das Projekt Bild-Lupe wurde in der Erprobungsphase von Fabien Bodard optimiert.

Bild1

Abbildung 23.3.5.4.1: Bild-Lupe als beeindruckender Effekt

Im Unterschied zum Beispiel-Projekt MapView ist die Bild-Lupe permanent eingeschaltet. Der Zoom kann vom Wert 1 (Bild:Original=1) bis zum Wert 3 über einen Schieberegler kontinuierlich geändert werden. Die bemerkenswerteste Änderung gegenüber dem Projekt MapView ist die Verwendung eines Timers, mit dem das Bild in kleinen Zeitintervallen stets neu gezeichnet wird.

Quelltext:

[1] ' Gambas class file
[2] 
[3] Private $sFile As String
[4] Private $hImage As Image
[5] Private $himgZoom As Image
[6] Private $iLensSize As Integer = 256
[7] Private $fZoom As Float = 2
[8] Private $bMouseDown As Boolean
[9] Private $MX As Integer
[10] Private $MY As Integer
[11] 
[12] ' Special technique to delay and cumulate drawing events
[13] ' In some case of too numerous call this allow to reduce it to one call by event loop
[14] ' Durch den Timer werden viele - sonst notwendige - Auswertungen der Event-Schleife auf
[15] ' einen Aufruf reduziert: $TimerDraw.Trigger 
[16] 
[17] Private $TimerDraw As Timer
[18] 
[19] Public Sub _new()
[20]   $TimerDraw = New Timer As "TimerDraw"
[21]   $TimerDraw.Delay = 5
[22] End ' _new()
[23] 
[24] Public Sub Form_Open()
[25]   FMain.H = 636
[26]   FMain.W = 806
[27]   FMain.Center
[28]   $sFile = "fractal.jpg"
[29]   Try $hImage = Image.Load($sFile)
[30]   If Error Then 
[31]      Message(Error.Text)
[32]      Return
[33]   Endif
[34]   Slider1.Value = 200
[35]   lblDisplayZoom.Text = ("Zoom-Factor = ") & Str(Slider1.Value / 100)
[36]   ScrollArea1.ResizeContents($hImage.Width, $hImage.Height)
[37]   $TimerDraw.Trigger ' Call refreshing
[38] End ' Form_Open()
[39] 
[40] Public Sub btnFileOpen_Click()  
[41]   Dialog.Path = User.Home
[42]   Dialog.Title = ("Select an image ...")
[43]   Dialog.Filter = (["*.png;*.jpg", ("Images")])
[44]   If Not Dialog.OpenFile() Then
[45]      $sFile = Dialog.Path
[46]      Try $hImage = Image.Load($sFile)
[47]      If Error Then 
[48]         Message(Error.Text)
[49]         Return
[50]      Endif
[51]      ScrollArea1.ResizeContents($hImage.Width, $hImage.Height)
[52]      $TimerDraw.Trigger
[53]   Endif  
[54] End ' btnFileOpen_Click()
[55] 
[56] Public Sub ScrollArea1_Draw()
[57]   
[58]   If Not $hImage Then Return
[59]   
[60]   Paint.DrawImage($hImage, 0 - ScrollArea1.ScrollX, 0 - ScrollArea1.ScrollY, $hImage.Width, 
                $hImage.Height)
[61]   If $bMouseDown Then
[62]      Paint.LineWidth = 2
[63]      Paint.Brush = Paint.Image($himgZoom, $mx - $iLensSize / 2, $my - $iLensSize / 2)   
[64]      Paint.Arc($MX, $MY, $iLensSize / 2)
[65]      Paint.Fill(True)    
[66]      Paint.Brush = Paint.Color(Color.Blue)
[67]      Paint.Stroke    
[68]   Endif
[69]   
[70] End ' ScrollArea1_Draw()
[71] 
[72] Public Sub ScrollArea1_MouseDown()
[73]   ScrollArea1_MouseMove
[74] End ' ScrollArea1_MouseDown()
[75] 
[76] Public Sub ScrollArea1_MouseUp()  
[77]   $bMouseDown = False
[78]   $TimerDraw.Trigger
[79] End ' ScrollArea1_MouseUp()  
[80] 
[81] Public Sub ScrollArea1_MouseMove()  
[82]   Dim iMx, iMy As Integer
[83]   Dim fSquareSize As Float 
[84]   Dim tmpImg, tmpImg2 As Image
[85]   
[86]   If Not $hImage Then Return
[87]   
[88]   $MX = Mouse.X
[89]   $MY = Mouse.y
[90]   If Mouse.Left Then 
[91]   ' Real position of the mouse
[92]     iMx = Mouse.x + ScrollArea1.ScrollX
[93]     iMy = Mouse.y + ScrollArea1.ScrollY    
[94]   ' Copy the part below divide by the zoom level
[95]     fSquareSize = $iLensSize / $fZoom
[96]     tmpImg = New Image(fSquareSize, fSquareSize, Color.DarkGray)
[97]     tmpImg2 = $hImage.Copy(iMx - fSquareSize / 2, iMy - fSquareSize / 2, fSquareSize, fSquareSize)
[98]     
[99]     Paint.Begin(tmpImg)
[100]       If iMy > $hImage.Height / 2 Then
[101]          If iMx > $hImage.Width / 2 Then
[102]           ' Bottom/Right
[103]             Paint.DrawImage(tmpImg2, 0, 0)
[104]          Else
[105]           ' Bottom/Left
[106]             Paint.DrawImage(tmpImg2, Paint.Width - tmpImg2.Width, 0)
[107]          Endif
[108]       Else
[109]          If iMx > $hImage.Width / 2 Then
[110]           ' Top/Right
[111]             Paint.DrawImage(tmpImg2, 0, Paint.Height - tmpImg2.Height)
[112]          Else
[113]           ' Top/Left
[114]             Paint.DrawImage(tmpImg2, Paint.Width - tmpImg2.Width, Paint.Height - tmpImg2.Height)
[115]          Endif
[116]       Endif    
[117]     Paint.End
[118]     
[119]     $himgZoom = tmpImg.Stretch($iLensSize, $iLensSize)    
[120]     $bMouseDown = True
[121]     $MX = Mouse.X
[122]     $MY = Mouse.y
[123]     $TimerDraw.Trigger
[124]   Endif
[125]   
[126] End ' ScrollArea1_MouseMove()  
[127] 
[128] Public Sub TimerDraw_Timer()  
[129]   ScrollArea1.Refresh  
[130] End ' TimerDraw_Timer()  
[131] 
[132] Public Sub Slider1_Change()
[133]   $fZoom = Round(Slider1.Value / 100, -2)
[134]   lblDisplayZoom.Text = ("Zoom-Factor = ") & $fZoom
[135]   $TimerDraw.Trigger
[136] End ' Slider1_Change()
[137] 
[138] Public Sub btnClose_Click()
[139]   FMain.Close
[140] End ' btnClose_Click()

Download

Wir verwenden Cookies, um unser Internetangebot optimal zu gestalten. Durch weitere Nutzung dieser Webseite stimmen Sie der Verwendung von Cookies zu. Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung
k23/k23.3/k23.3.5/k23.3.5.4/start.txt · Zuletzt geändert: 20.06.2016 (Externe Bearbeitung)

Seiten-Werkzeuge