Bild-im-Bild-Finder (für DrawImageRect Parameter)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

SpionAtom

Betreff: Bild-im-Bild-Finder (für DrawImageRect Parameter)

BeitragMo, Sep 01, 2008 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Bild-im-Bild-Finder

Was ist das?
Wer kennt das nicht, man hat alle seine Grafiken in einem großen Bild.
user posted image

Um nun die einzelen Teilbilder einzubauen, benutzt man typischerweise den Befehl DrawImageRect
Code: [AUSKLAPPEN]
Function draw(n, x, y)   

   Select n
      Case 1
         DrawImageRect picObjects, x, y, 0, 0, 44, 54
      Case 2
         DrawImageRect picObjects, x, y, 45, 0, 44, 54
...


Und um diese Parameter von DrawImageRect gehts. Damit man sie schnell und bequem nachschauen kann, gibts dieses Programm.


Code: [AUSKLAPPEN]
;Der Picmapchecker erkennt zusammenhängende Bildteile auf einem Bild.
;Dazu muss man das Bild an sich, sowie die MaskColor angeben.
;
;Linksklick: sucht ein Teilbild an Mausposition
;Rechtsklick: zeigt Umrisse des gefundenen Bildes
;Mittelklick: verschiebt Bild   
   
   Const maskColorR = 255, maskColorG = 0, maskColorB = 255   ;<------ Maskcolor
   Graphics 240, 180, 0, 3
   Global pic = LoadImage("picmapchecker_example.PNG")      ;<-------- Bild


Global picWidth = ImageWidth(pic), picHeight = ImageHeight(pic)
Global picCheck
Global returnString$, mask, white, X1, Y1, X2, Y2

   picMask = CreateImage(2, 1): SetBuffer ImageBuffer(picMask)
      Color maskColorR, maskColorG, maskColorB: Plot 0, 0
      Color 255, 255, 255: Plot 1, 0
   LockBuffer(ImageBuffer(picMask)): mask = ReadPixelFast(0, 0): white = ReadPixelFast(1, 0): UnlockBuffer(ImageBuffer(picMask))

SetBuffer BackBuffer()
   
   Repeat
      mouse_x = MouseX(): mouse_y = MouseY()      
      
      ;Drag Pic
      If MouseDown(3) And startDrag = 0 Then startDrag = 1: picXold = picX: picYold = picY: dragX = mouse_x: dragY = mouse_y
      If MouseDown(3) And startDrag = 1 Then picX = picXold + (mouse_x - dragX): picY = picYold + (mouse_y - dragY)
      If Not MouseDown(3) And startDrag = 1 Then startDrag = 0

      Cls
      DrawBlock pic, picX, picY
      If MouseDown(2) Then DrawBlock picCheck, picX, picY      
      
      Color 0, 255, 0
      mx = mouse_x - picX: my = mouse_y - picY
      If mx < 0 Or my < 0 Or mx >= picWidth Or my >= picHeight Then
         Color 255, 0, 0
      Else
         If MouseHit(1) Then
            picCheck = CreateImage(picWidth, picHeight)
            checkAt(mx, my)
         End If      
      End If
      
      Text 0, 0, (mouse_x - picX) + "," + (mouse_y - picY)
      Text 0, 16, returnString$
      Rect X1 + picX, Y1 + picY, X2 - X1 + 1, Y2 - Y1 + 1, 0      
      Flip()

   Until KeyDown(1)
   End

Function checkAt(x, y)

   X1 = x:   Y1 = y:   X2 = x:   Y2 = y   
   LockBuffer ImageBuffer(pic)
      rgb = ReadPixelFast(x, y, ImageBuffer(pic))
   If rgb = mask Then returnString$ = "Maskcolor here": UnlockBuffer ImageBuffer(pic): Return
   LockBuffer ImageBuffer(picCheck)
      check(x, y)
   UnlockBuffer ImageBuffer(pic)
   UnlockBuffer ImageBuffer(picCheck)   
   returnString$ = X1 + "," + Y1 + "," + (X2 - X1 + 1) + "," + (Y2 - Y1 + 1)
End Function
Function check(x, y)

   If x < 0 Or y < 0 Or x >= picWidth Or y >= picHeight Then Return
   white_check = ReadPixelFast(x, y, ImageBuffer(picCheck))
   If white_check = white Then Return
   rgb = ReadPixelFast(x, y, ImageBuffer(pic))   
   If rgb = mask Then Return
   WritePixelFast x, y, white, ImageBuffer(picCheck)
   If x < X1 Then X1 = x
   If x > X2 Then X2 = x
   If y < Y1 Then Y1 = y
   If y > Y2 Then Y2 = y
      
      check(x - 1, y - 1)
      check(x, y - 1)
      check(x + 1, y - 1)
      check(x - 1, y)
      check(x + 1, y)
      check(x - 1, y + 1)
      check(x, y + 1)
      check(x + 1, y + 1)
End Function


Kleine Warnung: Habs bis jetzt nur mit einigermaßen kleinen Bildern getestet. Da das Programm mit Rekursionen arbeitet, kann es bei allzugroßen Bildern zum Overflow kommen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

ozzi789

BeitragMo, Sep 01, 2008 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich find es rein Technisch ziemlich clever gemacht Wink
Vlt kan ich das ja mal brauchen Very Happy



*edit*

Also bei Bilder wie 600*500 hat er keine probleme wen die einzelenen "bilder" nicht zu gross sind.
Auch bei ganz dünnen Lienien die zmb zu einem 5-eck verlaufen kann es probleme geben Razz


aber sonst gut umgesetzt !
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

SpionAtom

BeitragMo, Sep 01, 2008 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich das Bild mit den dünnen Linien haben? Bei mir gabs bisher nämlich keine Probleme.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

ozzi789

BeitragMo, Sep 01, 2008 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab einfach ein mit 1 pixel linien in paint ein grosses 5eck gemacht (10 x grösser als die normalen dinger) und dan hats ned funktioniert.

denke es war einfach zu gross, aber wen die icons klein sind ist es egal wie dünn oder wie gross die ganze bilddatei ist.

auch bei der preformance ist es ziemlich schnell Very Happy
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

SpionAtom

BeitragMo, Sep 01, 2008 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Neues Testbild. Keines brachte bei Probleme mit sich, auch nicht performancetechnisch.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

ozzi789

BeitragMo, Sep 01, 2008 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
SpionAtom hat Folgendes geschrieben:
Neues Testbild. Keines brachte bei Probleme mit sich, auch nicht performancetechnisch.


Dann hab ich einfach blödes zeug gezeichnet, und hab ja gesagt bei der Preformance , kein problem Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group