Seite 1 von 3
[gelöst] Bereich mit Muster füllen
Verfasst: 20.02.2008 23:15
von scholly
moin, moin...
Ich hab mal versucht, einen weißen Bereich in einem schwarzen Quadrat mit einem vorgegebenen Muster zu füllen.
Natürlich "zu Fuß"

, da ich von GFX und 2D und so noch arg wenig, bzw keine Ahnung habe.
Code: Alles auswählen
; Bereich_mit_Muster_füllen_2.pb
; scholly
musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()
If LoadFont(1, "Arial", 64,#PB_Font_Bold) = 0
Debug "font nich jefunden"
End
EndIf
Procedure move_texture_to_box()
For line = 1 To 256
For column = 1 To 256
StartDrawing(ImageOutput(2))
mask_color = Point(column,line)
StopDrawing()
If mask_color = #White ;nur dann brauchen wir das Muster
StartDrawing(ImageOutput(1))
thiscolor = Point(column,line)
StopDrawing()
StartDrawing(ImageOutput(3))
Plot(column,line, thiscolor)
StopDrawing()
EndIf
Next column
Next line
EndProcedure
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
If LoadImage(1, musterfile.s)
ImageGadget(1, 10, 10, 256, 256, ImageID(1))
Else
Debug "error: LoadImage(0, musterfile.s)"
EndIf
If CreateImage(2, 256, 256)
StartDrawing(ImageOutput(2))
DrawingFont(FontID(1))
DrawText(20,64,"Hallo",#White,#Black)
StopDrawing()
ImageGadget(2, 286, 10, 256, 256, ImageID(2))
Else
Debug "error: CreateImage(1, 256, 256)"
EndIf
If CreateImage(3, 256, 256)
move_texture_to_box()
ImageGadget(3, 586, 10, 256, 256, ImageID(3))
Else
Debug "error: CreateImage(3, 256, 256)"
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Zum Üben war das ganz gut.
Ich bin mir aber sicher, es gibt eine einfachere und schneller Möglichkeit, als meine Procedure
move_texture_to_box().
Mag (mir) jemand den effizienten Ersatz zeigen ?
mDv... scholly
[Edit 1:] Text statt Box zeichnen
Verfasst: 20.02.2008 23:19
von AND51
Coden kann ich dir momentan leider nichts.
Aber ich verweise auf die Befehle DrawingBuffer(), DrawingBufferPitch() und DrawingBufferLine().
Damit erhälst du direkten zugriff auf ein Bild und kannst es nach belieben manipulieren, (fast) genau so, als bearbeitest du Strings mit Pointer.
Diese Methode ist sehr, sehr schnell und viel besser als deine Point/Plot Methode.
Wie gesagt, momentan kann ich leider nur darauf verweisen, weil ich keine Zeit habe; wenn du aufgrund deines Anfängerstatus noch nichts mit den Befehlen anfangen kannst, warte, bis jemand was anderes postet.
Verfasst: 21.02.2008 00:04
von hjbremer
Vielleicht hilft dir das weiter ! Auf White prüfe ich aber nicht, da ich den tieferen Sinn nicht verstehe.
Code: Alles auswählen
musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()
Enumeration
#image1
#image2
#image3
#button1
#button2
#button3
EndEnumeration
Procedure move_texture_to_box(br,hh)
ID = CopyImage_(ImageID(#image1), #IMAGE_BITMAP, br/4, hh/4, 0)
brush = CreatePatternBrush_(ID)
DeleteObject_(ID)
id = CreateImage(#image3, br, hh)
dc = StartDrawing(ImageOutput(#image3))
r.rect
r\left=64
r\right=64+128
r\top=64
r\bottom=64+128
FillRect_(dc,r,brush)
txt$="Hallo"
DrawingMode(#PB_2DDrawing_Transparent)
txtbr=TextWidth(txt$)
txthh=TextHeight(txt$)
txtsp=(br-txtbr)/2
txtze=(hh-txthh)/2
DrawText(txtsp,txtze,txt$,#blue)
StopDrawing()
EndProcedure
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
If LoadImage(#image1, musterfile.s)
ImageGadget(#button1, 10, 10, 256, 256, ImageID(#image1))
Else
Debug "error: LoadImage(0, musterfile.s)"
EndIf
If CreateImage(#image2, 256, 256)
StartDrawing(ImageOutput(#image2))
Box(64,64,128,128, #White)
StopDrawing()
ImageGadget(#button2, 286, 10, 256, 256, ImageID(#image2))
Else
Debug "error: CreateImage(1, 256, 256)"
EndIf
move_texture_to_box(256,256)
ImageGadget(#button3, 586, 10, 256, 256, ImageID(#image3))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
PS: benutze möglichst Konstanten, erleichtert die Arbeit, fördert die Pflege und Übersichtlichkeit.
Verfasst: 21.02.2008 00:28
von scholly
hjbremer hat geschrieben:Vielleicht hilft dir das weiter ! Auf White prüfe ich aber nicht, da ich den tieferen Sinn nicht verstehe.
PS: benutze möglichst Konstanten, erleichtert die Arbeit, fördert die Pflege und Übersichtlichkeit.
Normalerweise bnenutze ich an passender Stelle Variablen bzw Konstanten, aber ich wollt das Beispiel so einfach wie möglich halten.
Ziel is es letztendlich, einen (weißen) Text in einem Image, das auf einem WindowedScreen bewegt werden soll, mit einem Muster (Texture?) aus einem anderen Image zu füllen.
sich den Code zu gemüte führend... scholly
[edit 1:] meinen Code oben ersetzt: Text statt Box
Verfasst: 21.02.2008 20:41
von tobe
hallo scholly,
ich hab mal etwas mit MaskBlt_() rumgespielt und das ist dabei rausgekommen, aber ganz verstanden hab ich es auch noch nicht
Code: Alles auswählen
EnableExplicit
Enumeration
#TEXTUR
#TEXT
#MIXED
EndEnumeration
Procedure MaskBlt(BmpID.l, TexturDC.l, MaskID.l)
Protected hdc.l
hdc = CreateCompatibleDC_(TexturDC)
SelectObject_(hdc, BmpID)
MaskBlt_(hdc, 0, 0, 256, 256, TexturDC, 0, 0, MaskID, 0, 0, #SRCCOPY)
DeleteDC_(hdc)
EndProcedure
Define musterfile.s, MaskID.l, BmpID.l, TexturDC.l
musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()
If Not LoadFont(0, "Arial", 64,#PB_Font_Bold)
Debug "font nich jefunden"
End
EndIf
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
If LoadImage(#TEXTUR, musterfile.s)
ImageGadget(0, 10, 10, 256, 256, ImageID(0))
Else
Debug "error: LoadImage(#TEXTUR, musterfile.s)"
EndIf
MaskID = CreateImage(#TEXT, 256, 256, 1)
If MaskID
StartDrawing(ImageOutput(#TEXT))
DrawingFont(FontID(0))
DrawText(20,64,"Hallo",#White,#Black)
StopDrawing()
ImageGadget(#TEXT, 286, 10, 256, 256, ImageID(#TEXT))
Else
Debug "error: CreateImage(#TEXT, 256, 256)"
EndIf
BmpID = CreateImage(#MIXED, 256, 256)
If BmpID
TexturDC = StartDrawing(ImageOutput(#TEXTUR))
MaskBlt(BmpID, TexturDC, MaskID)
StopDrawing()
ImageGadget(#MIXED, 586, 10, 256, 256, ImageID(#MIXED))
Else
Debug "error: CreateImage(#MIXED, 256, 256)"
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
mfG
tobe
Verfasst: 21.02.2008 23:08
von scholly
Boah ay, ist das schnell...
tobe hat geschrieben:ich hab mal etwas mit MaskBlt_() rumgespielt und das ist dabei rausgekommen, aber ganz verstanden hab ich es auch noch nicht
Vielleicht kann ich ja was draus lernen.
Danke... scholly
Verfasst: 22.02.2008 17:25
von hjbremer
Die Idee mit MaskBlt ist ja gut, aber schwer zu verstehen.
und ich glaube auch nicht ganz das was du wolltest.
Allerdings das verstehe ich auch nicht so ganz.
Hier eine neue Idee. nicht die schnellste, aber ...
Code: Alles auswählen
; Bereich_mit_Muster_füllen_2.pb
; scholly / hjbremer
musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()
If LoadFont(1, "Arial", 64,#PB_Font_Bold) = 0
Debug "font nich jefunden"
End
EndIf
Procedure move_texture_to_box()
dc=StartDrawing(ImageOutput(2))
ID = CopyImage_(ImageID(1), #IMAGE_BITMAP, 40, 40, 0)
brush = CreatePatternBrush_(ID)
DeleteObject_(ID)
For line = 1 To 256
For column = 1 To 256
mask_color = Point(column,line)
If mask_color = #White ;nur dann brauchen wir das Muster
SelectObject_(dc,brush)
ExtFloodFill_(dc,column,line,#White,#FLOODFILLSURFACE)
Break
EndIf
Next column
Next line
StopDrawing()
EndProcedure
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
If LoadImage(1, musterfile.s)
ImageGadget(1, 10, 10, 256, 256, ImageID(1))
Else
Debug "error: LoadImage(0, musterfile.s)"
EndIf
If CreateImage(2, 256, 256)
dc=StartDrawing(ImageOutput(2))
DrawingFont(FontID(1))
DrawText(20,64,"Hallo",#White,#Black)
StopDrawing()
ImageGadget(2, 286, 10, 256, 256, ImageID(2))
Else
Debug "error: CreateImage(1, 256, 256)"
EndIf
move_texture_to_box()
SetGadgetState(2,ImageID(2))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Verfasst: 22.02.2008 21:17
von scholly
hjbremer hat geschrieben:Die Idee mit MaskBlt ist ja gut, aber schwer zu verstehen.
und ich glaube auch nicht ganz das was du wolltest.
Allerdings das verstehe ich auch nicht so ganz.
Hatte ich doch oben erklärt: Buchstaben mit Muster hinterlegen und dann übern Screen bewegen.
Und z.Zt. sammle ich noch Wissen, wie ich die Buchstaben am schnellsten fülle.
hjbremer hat geschrieben:Hier eine neue Idee. nicht die schnellste, aber ...
... auch interessant für mich zum lernen
danke...
Verfasst: 22.02.2008 21:27
von Kaeru Gaman
> Und z.Zt. sammle ich noch Wissen, wie ich die Buchstaben am schnellsten fülle.
mit masked sprites müßtest du am effektivsten sein...
ich hatte irgendwo mal nen democode gepostet, wo buchstaben rumsausen,
die nen auf- und ab- wandernden farbverlauf drauf hatten.
ich hab zuerst die buchstaben als transparenzfarbe auf maskensprites gelegt.
dann hab ich den farbigen hintergrund auf ein zielsprite gelegt und die maske drüber.
Verfasst: 22.02.2008 21:40
von scholly
Kaeru Gaman hat geschrieben:ich hatte irgendwo mal nen democode gepostet, wo buchstaben rumsausen,
Ich melde mich dann 2009 wieder, wenn ich alle Deine 13000 Postings durch habe
