[B3D] 2D-Lupe

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Der Eisvogel

Betreff: [B3D] 2D-Lupe

BeitragDo, Okt 16, 2008 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich habe eine 2D Lupe benötigt, und habe gedacht, der ein oder andere braucht sowas bestimmt auch.

Also, erstmal die Erklärung der Funktion:

Aufruf:
Code: [AUSKLAPPEN]
Loupe(lpimg,lpx,lpy,lmx,lmy,zmbf[,zoom])

Parameter:
Code: [AUSKLAPPEN]
lpimg = Handle der Lupe (z.B. mit CreateImage ermittelt)
lpx = X-Koordinate der Lupe
lpy = Y-Koordinate der Lupe
lmy = X-Koordinate des Mittelpunktes der Lupe
lmy = Y-Koordinate des Mittelpunktes der Lupe
zoom = Zomm-Faktor der Lupe (Standard=2)


Der Buffer, der gesetzt ist, der wird in das Bild der Lupe vergößert eingezeichnet.

Jetzt muss man die Lupe nur noch einzeichnen:
Code: [AUSKLAPPEN]
DrawImage lpimg,lpx,lpy


Jetzt könnte man die Lupe noch ein wenig verzieren.
Wichtig dabei ist: Jedes mal, wenn man die Funktion aufruft, wird das Bild der Lupe komplett übermalt, man muss also die Verzierungen jedes mal neu zeichnen.

Jetzt die Funktion:
Code: [AUSKLAPPEN]
Function Loupe(lpimg,lpx,lpy,lmx,lmy,zoom=2)
   If zoom<1 Then RuntimeError(Chr(34)+"zoom"+Chr(34)+" must be greater then 0.")
   
   Local zmbf=GraphicsBuffer()
   Local loupe_width=ImageWidth(lpimg)-1
   Local loupe_height=ImageHeight(lpimg)-1
   
   LockBuffer zmbf
   LockBuffer ImageBuffer(lpimg)
   For y=0 To loupe_height/zoom
      For x=0 To loupe_width/zoom
         rgbpx=x+lpx+lmx/zoom*(zoom-1)
         rgbpy=y+lpy+lmy/zoom*(zoom-1)
         
         If rgbpx>=0 And rgbpx<GraphicsWidth() And rgbpy>=0 And rgbpy<GraphicsHeight() Then
            rgb=ReadPixelFast(rgbpx,rgbpy,zmbf)
         Else
            rgb=$FF000000
         EndIf
         
         For ty=0 To zoom-1
            For tx=0 To zoom-1
               rgbpx=x*zoom+tx
               rgbpy=y*zoom+ty
               If rgbpx<loupe_width And rgbpy<loupe_height Then
                  WritePixelFast(rgbpx,rgbpy,rgb,ImageBuffer(lpimg))
               EndIf
            Next
         Next
      Next
   Next
   UnlockBuffer zmbf
   UnlockBuffer ImageBuffer(lpimg)
End Function


Und zum Schluss noch ein Beispiel:
Code: [AUSKLAPPEN]
Graphics 640,480,16,2

HidePointer

wallpaper=LoadImage("wallpaper.png")

loupe=CreateImage(150,150)
loupe_1=LoadImage("loupe.png") : MaskImage loupe_1,255,0,200
loupe_2=CreateImage(150,210) : MaskImage loupe_2,255,0,255

zoom=2

SetBuffer BackBuffer()
Repeat
Cls

DrawImage wallpaper,0,0

Loupe(loupe,MouseX()-75,MouseY()-105,60,60,zoom)

SetBuffer ImageBuffer(loupe_2)
DrawImage loupe,0,0
DrawImage loupe_1,0,0
SetBuffer BackBuffer()

DrawImage loupe_2,MouseX()-75,MouseY()-105

If MouseHit(1) Then zoom=zoom+1
If MouseHit(2) And zoom>1 Then zoom=zoom-1

Flip
Until KeyDown(1)

WaitKey
End


Mit der linken Maustaste kann man den Zomm-Faktor erhöhen, und mit der rechten erniedrigen.

Hier das ganze als Download-Paket mit Test-Bildern:
Download-Paket

Kritik ist erwünscht.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
  • Zuletzt bearbeitet von Der Eisvogel am Fr, Okt 17, 2008 18:04, insgesamt 4-mal bearbeitet

Valnar

BeitragDo, Okt 16, 2008 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Da stimmt etwas nicht im Download-Paket-Beispiel-Code, er meckert beiCode: [AUSKLAPPEN]
Loupe(Loupe,MouseX()-75,MouseY()-105,60,60,BackBuffer(),zoom)
das dieser zu viele Parameter hat Wink

Der Eisvogel

BeitragDo, Okt 16, 2008 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, sry.

Ich hab den Link oben erneuert jetzt müsste es gehen.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Nova

BeitragDo, Okt 16, 2008 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Da war wohl das backbuffer() zuviel.

Fehler: Wenn man aus dem Bild raus geht kommt ein MAV wegen ReadPixelFast, allerdings nur oben und unten.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Der Eisvogel

BeitragDo, Okt 16, 2008 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, bei mit kommt keine MAV, aber ich sehe lustige Dinge, die man sonst eigentlich nicht zu gesicht bekommt.

Aber wenn du willst, dann könnte ich das fixen.

EDIT: So erledigt, Link immernoch der Selbe.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group