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

![]() |
SpionAtomBetreff: Bild-im-Bild-Finder (für DrawImageRect Parameter) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bild-im-Bild-Finder
Was ist das? Wer kennt das nicht, man hat alle seine Grafiken in einem großen Bild. 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich find es rein Technisch ziemlich clever gemacht ![]() Vlt kan ich das ja mal brauchen ![]() *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 ![]() aber sonst gut umgesetzt ! |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group